Evitare l'istanza di Java

2

Sto cercando di verificare se il mio array A ha un'istanza dell'oggetto B nella posizione corrente, poiché è un array che può contenere due tipi di oggetti (B e C). Non voglio usare instanceof, quindi mi chiedo quali altre alternative ho?

if(A[i] instanceof B)
    
posta anonymous 11.02.2017 - 18:47
fonte

3 risposte

10

L'alternativa principale all'uso di instanceof è polimorfismo . Piuttosto, chiedete quale tipo di oggetto avete nella posizione corrente, dite all'oggetto, qualunque esso sia, di fare ciò che volete. Se entrambi gli oggetti sanno come farlo, allora funziona bene, anche se lo fanno diversamente. Il principio al lavoro qui è chiamato Racconta, non chiedere .

Se la lingua che stai utilizzando non ha digitazione anatra avrai bisogno dei tipi B e C per entrambi in modo esplicito implementare la stessa interfaccia o tipo astratto con il metodo che si desidera chiamare. Ciò significherebbe che il tuo array è omogeneo . È quando è eterogeneo che ti rimane senza alcuna idea se puoi chiamare il metodo in modo sicuro finché non lo chiedi.

Se lavori su un codice base che utilizza un paradigma orientato agli oggetti le persone si arrabbieranno molto vedi l'uso di instanceof . Non tanto se ti trovi in un paradigma procedurale .

Questo non significa che un solo paradigma abbia sempre ragione. Ma quando a Roma ...

Un esempio spesso usato:

Al pet show metti in fila i tuoi adorabili animali davanti al tuo pubblico. Per mostrare quanto sono ben allenati, dici a ciascuno: "Parla!"

I tuoi ciarlatani.

Il tuo cane abbaia.

Il tuo gatto ti guarda in modo divertente e poi ti ignora.

Il tuo animale domestico strappa un buco nel tessuto della realtà perché i progettisti della tua realtà hanno dimenticato di dare alle rocce qualsiasi tipo di funzione parlante.

Il rock è quello che metterebbe il tuo array nella categoria eterogenea. Tieni le rocce fuori dall'array e puoi evitare instanceof .

    
risposta data 11.02.2017 - 19:29
fonte
3

"Sto cercando di verificare se il mio array A ha un'istanza dell'oggetto B nella posizione corrente"

Se questo è quello che vuoi, allora usare instanceof è il modo più pulito per ottenerlo. Si potrebbe in qualche modo osservare un comportamento dell'istanza e dedurre la classe a cui appartiene, ma quello è un hack.

La tua domanda dovrebbe essere davvero "Come evitare di dover sapere se A ha un'istanza di oggetto B nella posizione corrente". Ecco a cosa servono l'ereditarietà e i metodi virtuali. Se le istanze di B e C si comportano in modo diverso, ma puoi fare una chiamata al metodo che funzionerà correttamente sia per le istanze di B che di C, allora non hai bisogno di sapere di quale classe B è un'istanza e il tuo problema scompare.

    
risposta data 12.02.2017 - 00:15
fonte
0

Il polimorfismo è la risposta principale - istruisci semplicemente ogni oggetto dell'array a fare tutto il necessario e implementare quel metodo in A e B per fare tutto ciò che avresti fatto dopo aver determinato il loro tipo.

Ma se vuoi veramente conoscere il tipo senza eseguire immediatamente qualcosa, potresti anche aggiungere un metodo per comunicare il loro tipo, come isA() e isB() . Potresti anche inserirli in un'interfaccia, renderli entrambi un metodo default e lasciarli restituire false . In questo modo, A deve solo sostituire isA() e B deve solo sostituire isB() .

Tenete presente che (come indicato in alto) di solito è possibile e preferibile una bella soluzione che coinvolge il polimorfismo. Ma ci sono casi nella gestione della struttura dei dati in cui lo stile unione ( isA() / isB() ) ha senso. È essenzialmente una soluzione alternativa per le lingue che non hanno la corrispondenza del modello (come Java).

    
risposta data 11.02.2017 - 23:12
fonte

Leggi altre domande sui tag