Innanzi tutto, dovresti essere coerente con la convenzione quadro. Java è un grande mondo per essere sicuro. Io uso Java per Android, e qui la convenzione è piuttosto permissiva.
Ad esempio, setOnClickListener
ti permette di passare in null
- questo è un modo rozzo ma non ambiguo per rimuovere il listener.
Dal codice sorgente Android:
public class View implements Drawable.Callback, KeyEvent.Callback, AccessibilityEventSource {
// [snip]
/**
* Register a callback to be invoked when this view is clicked. If this view is not
* clickable, it becomes clickable.
*
* @param l The callback that will run
*/
public void setOnClickListener(OnClickListener l) {
if (!isClickable()) {
setClickable(true);
}
getListenerInfo().mOnClickListener = l;
}
Null va bene:
/**
* Return whether this view has an attached OnClickListener. Returns
* true if there is a listener, false if there is none.
*/
public boolean hasOnClickListeners() {
ListenerInfo li = mListenerInfo;
return (li != null && li.mOnClickListener != null);
}
Dove sono consentiti più listener, anche la rimozione di un listener è un'operazione tollerante:
/**
* Remove a listener for layout changes.
*
* @param listener The listener for layout bounds change.
*/
public void removeOnLayoutChangeListener(OnLayoutChangeListener listener) {
ListenerInfo li = mListenerInfo;
if (li == null || li.mOnLayoutChangeListeners == null) {
return;
}
li.mOnLayoutChangeListeners.remove(listener);
}
mOnLayoutChangeListeners
è un ArrayList
e ArrayList.remove(Object object)
non si blocca su un elemento inesistente - restituisce semplicemente false
.
La linea di fondo è il principio di robustezza - sii prudente in ciò che fai, sii liberale in ciò che accetti agli altri .
In caso di dubbio, andrei con il liberale, a meno che tu non abbia una solida ragione per non farlo. È più semplice e meno sorprendente. La coerenza è il re e il principio di stupore si basa sulla coerenza.
Eventuali precondizioni dovrebbero essere chiaramente documentate. La tua definizione di interface Service
di per sé non promette di generare eccezioni quando viene passato nulla.
Le annotazioni
@NonNull
e @Nullable
possono aiutare a rimuovere l'ambiguità e sono supportate da IDE validi come IntelliJ Idea o Android Studio.