La risposta breve è che non c'è niente in Java il più vicino possibile, ma ci sono alternative. Lo schema dei delegati non è difficile da implementare, non è proprio così conveniente come farlo con Objective-C.
La ragione di lavoro "protocolli informali" in Objective-C è perché il linguaggio supporta categorie, che permettono di aggiungere metodi alle classi esistenti senza sottoclasse, o addirittura avere accesso al codice sorgente. Pertanto, molti protocolli informali sono una categoria su NSObject. Questo è chiaramente impossibile in Java.
Objective-C 2.0 opta per i metodi di protocollo @optional, che è un'astrazione molto più pulita e preferita per il nuovo codice, ma anche per avere un equivalente in Java.
Onestamente, l'approccio più flessibile consiste nel definire un protocollo delegato, quindi le classi implementano tutti i metodi. (Con IDE moderni come Eclipse, questo è banale.) Molte interfacce Java hanno una classe adattatore associata, e questo è un approccio comune per non richiedere all'utente di implementare molti metodi vuoti, ma limita l'ereditarietà, il che rende inflessibile la progettazione del codice . (Josh Bloch affronta questo nel suo libro "Efficace Java".) Il mio suggerimento sarebbe di fornire solo un'interfaccia prima, quindi aggiungere un adattatore se è veramente necessario.
Qualsiasi cosa tu faccia, evitare di lanciare un UnsupportedOperationException
per metodi "non implementati". Ciò impone alla classe delegante di gestire le eccezioni per i metodi che dovrebbero essere facoltativi. L'approccio corretto consiste nell'implementare un metodo che non fa nulla, restituisce un valore predefinito, ecc. Questi valori dovrebbero essere ben documentati per i metodi che non hanno un tipo di reso vuoto.
fonte
2009-07-31 03:00:15
Lanciare "UnsupportedOperationException' è una pessima idea! Le API non dovrebbero mai obbligare gli utenti ad affrontare le eccezioni nei normali schemi di utilizzo, solo per un flusso eccezionale. Lo schema dei delegati in Cocoa è solido in quanto passa silenziosamente a metodi di delegati non implementati. –
Ottimo punto. Avevo dimenticato quanto fastidiose sono le eccezioni Java. –
@Quinn Taylor: tuttavia, è così che i "protocolli" opzionali * sono stati * fatti in molte parti della libreria Java. Ad esempio, l'interfaccia "Collection" specifica che metodi come add() e remove() sono "operazioni opzionali", che lancia UnsupportedOperationException se non lo supportano. – newacct