E 'una buona idea avere un tipo sicuro uguale a

2

Per me, equals() between objects of inconvertible types è una delle ispezioni IntelliJ più utili. Non è quasi mai inteso che oggetti con tipi diversi siano uguali tra loro.

Capisco che il metodo equals sia stato introdotto prima di Java 5, quindi non ci sono generici da sfruttare. Ma anche il nuovo% sicuro di% co_de introdotto da JDK7 non è ancora sicuro. Mi mancano alcune considerazioni chiave su questo design?

Per typesafe equals (), intendo qualcosa come Objects.equals . In modo che diventi un errore di compilazione piuttosto che un avviso di ispezione.

====================================

aggiunto il 2018-11-17:

RE: user949300 risposta. Capisco che ci saranno casi limite scoperti quando utilizzeremo una versione più limitata di public static <T> boolean equals(T a, T b) . Ma in realtà, nella maggior parte dei casi chiamando equals , stiamo davvero confrontando solo le DTO: hanno lo stesso tipo e hanno le stesse proprietà? Non sto suggerendo che dovremmo sempre utilizzare la versione limitata, ma dovrebbe aiutare nel 95% del caso in quanto il compilatore può rendere le cose più ovvie di un ispettore specifico per IDE.

    
posta Max 13.11.2018 - 16:29
fonte

1 risposta

7

Ignorando i problemi di cancellazione menzionati nei commenti, ci sono altri problemi con equals che potrebbero rendere problematica un'implementazione di tipo "sicuro". Il principale è come testare la compatibilità del tuo tipo T. Supponiamo tu abbia una classe Foo e una sottoclasse SpecialFoo .

Proponi questo: public static <T> boolean equals(T a, T b)

La classica domanda è, T deve essere una corrispondenza esatta? In altre parole, se a è un Foo e < strong> b è un SpecialFoo , possono essere uguali?

La risposta è "dipende" ed è specifica del dominio. Vedrai le guerre religiose online su questo.

Ad esempio, vedrai due diversi modi per testare la compatibilità dei tipi nel tipico metodo public boolean equals(Object other) .

  • alcuni usano this.getClass() == other.getClass() , corrispondenza esatta
  • alcuni usano other instanceof Foo le sottoclassi sono o.k.

Ti consiglio di dare un'occhiata a Java efficace per una discussione più ampia.

    
risposta data 13.11.2018 - 17:13
fonte

Leggi altre domande sui tag