Ho una strana domanda concettuale, non si tratta di un incidente specifico, ma solo di un approccio generale alle migliori pratiche.
Mi sono chiesto talvolta di definire i metodi java equal, ciò che rende uguali due oggetti. L'approccio semplice è quello di controllare piuttosto che ogni campo è uguale, tuttavia, ci sono occasioni in cui questo non è sempre logico. Ecco tre esempi a cui potrei pensare quando non sono sicuro che un campo dovrebbe essere parte di un metodo di uguaglianza:
-
campi transitori e dati di stato. Ad esempio, qualsiasi campo transitorio su un oggetto JPA. oppure dire che ho una classe plugin con una posizione jar e alcuni altri dati di identificazione per definire in modo univoco dove trovare un plugin da caricare, e un transient isLoaded Boolean che mi dice piuttosto che ho già provato a caricare il plugin. Dovrebbero essere uguali due riferimenti allo stesso plugin ma con variabili isLoaded differenti?
-
Costosi controlli di uguaglianza. Diciamo che ho una persona con un array di membri della famiglia. Se controllo tutti nell'array dei membri di famiglia, devo controllare tutti nel loro array ecc. E improvvisamente il mio metodo di uguaglianza controlla ogni persona in memoria, e deve controllare i cicli ecc.
-
Dati che potrebbero non essere caricati al momento del controllo di uguaglianza. Diciamo che ho un oggetto JPA composto da due soli campi, un nome univoco e un campo UUID generato dal database. Il nome identifica in modo univoco la riga del database, ma l'UUID esiste solo quando carico dal database. Come posso verificare se un oggetto che voglio salvare nel database è uguale a quelli che ho già caricato nel database, il fatto che un oggetto non abbia l'UUID generato dal database li rende unici, ecc? / p>
Mi rendo conto che a volte dipende da come prevedi di utilizzare il metodo di qualità. Tuttavia, in situazioni in cui stai scrivendo un oggetto e non sei ancora sicuro di come verrà utilizzato, come decidi cosa includere in un metodo uguale? Non ne sovrascrivi mai uno se non puoi includere tutti i campi nel controllo?
Se hai bisogno che la tua funzione di hash si comporti in un certo modo, che indirettamente definisce il modo in cui il tuo metodo di uguaglianza dovrebbe funzionare, ma qualcuno potrebbe facilmente assumere una diversa definizione di uguaglianza significa che devi semplicemente annotare bene il tuo metodo di parità, o è un odore di codice che hai fatto qualcosa di sbagliato?