Objective C style nil in java?

2

L'obiettivo C ha un concetto di un oggetto nullo che accetta qualsiasi chiamata di metodo con qualsiasi parametro senza lamentarsi e restituisce silenziosamente un altro zero.

Ho usato qualcosa di simile in Java usando easymock e mockito per i test. C'è qualcosa di simile per il codice di linea principale? È anche una buona idea avere qualcosa di simile?

Un caso d'uso in cui sto pensando di usarlo è con le metriche opzionali. Abbiamo contatori delle metriche di codahale su cui chiamiamo mark () ogni volta che viene generato un evento. Questo è circondato da un flag If / then per controllare le metriche abilitate. Potrei semplicemente usare un oggetto nil come contatore e accettare in silenzio la chiamata mark se le metriche non sono abilitate.

    
posta Usman Ismail 14.11.2012 - 08:52
fonte

2 risposte

2

Java non ha questo built-in - è un errore del programmatore per chiamare un messaggio su null che causa un'eccezione di runtime. Tuttavia, è un pattern chiamato Pattern oggetti nulli , che i programmatori usano per fornire il proprio equivalente.

Immagina di avere un'interfaccia, che rappresenta una connessione a un database. Potresti definire l'interfaccia in questo modo:

public interface DatabaseConnection {
public void connect(String username, String password, URL databaseLocation);
public void disconnect();
public String executeQuery(String query);
}

Il tuo oggetto Null potrebbe assomigliare a questo:

public class NullDatabaseConnection implements DatabaseConnection {
public void connect(String username, String password, URL databaseLocation) {}
public void disconnect() {}
public String executeQuery(String query) { return ""; }
}

Lo svantaggio di fare questo rispetto all'approccio ObjC è che devi scrivere il codice di cui sopra - non puoi ottenere automaticamente il comportamento usando l'oggetto nil . Il vantaggio è che questo oggetto Null esplicito funziona come ci si aspetterebbe in tutti i casi: puoi metterlo in una collezione, ad esempio, qualcosa che non puoi fare con nil di Objective-C.

    
risposta data 14.11.2012 - 10:29
fonte
0

Questa è una parte fondamentale di Runtime Objective-C . Su ogni singola chiamata di metodo , la prima cosa che fa è controllare se il riferimento all'oggetto è nil , e immediatamente restituisce se è così. Il runtime Java esegue sicuramente un controllo simile, ma risponde inviando una NullPointerException. Quindi stai chiedendo come modificare il comportamento fondamentale del runtime.

Ci sono un paio di modi per ottenere un effetto simile in Java:

  • Crea un'implementazione fittizia dell'interfaccia metrica che non fa nulla. Assegna questo valore alla variabile dell'oggetto metriche.
  • oppure: crea un singolo punto di ingresso statico per la tua classe di metriche e passa l'istanza come primo argomento e controlla se è null prima di fare qualsiasi altra cosa. per es.

.

public static void doMetrics(Metrics m, otherArgs ...) {
    if (m == null) return;

    ... do stuff with m ...
}

Entrambe offrono il minore costo di esecuzione di una chiamata al metodo inutile quando le metriche sono disattivate.

    
risposta data 14.11.2012 - 09:33
fonte

Leggi altre domande sui tag