2015-03-23 41 views
7

Si prega di guardare questo link di Java efficace di Joshua Bloch.Metodo uguale in Java efficace di Joshua Bloch

Nel secondo paragrafo, l'autore dice:

La classe è privata o un pacchetto-privato, e si è certi che il suo metodo equals non potrà mai essere invocato. Probabilmente, il metodo equals dovrebbe essere sovrascritti in queste circostanze, nel caso in cui venga accidentalmente invocato:

@Override public boolean equals(Object o) { 
    throw new AssertionError(); // Method is never called 
} 

Si prega di spiegare questo. Mi sto confondendo con l'uso dell'autore del termine classe privata e perché è necessario sovrascrivere il metodo equals quando sappiamo con certezza che non verrà invocato.

+1

Impossibile accedere a quella pagina. Segnala la parte importante. –

+0

Signore, ecco un altro link a questo articolo http: //jtechies.blogspot.in/2012/07/item-8-obey-general-contract-when.html \ – user961690

+2

Tu: * "quando sappiamo per certo che non sarà invocato "*; Joshua Bloch: * "nel caso venga invocato accidentalmente" *. hai un'altra domanda? – Tom

risposta

8

Una classe può essere privata solo se è una classe interiore.

Per quanto riguarda il "perché" c'è una necessità di sovrascrivere equals, il motivo è che scrivendo come avete dimostrato si assicurarsi che il metodo non viene mai chiamato intenzionalmente. Nel momento in cui sei mesi nel futuro, quando un nuovo sviluppatore del progetto chiamerà i pari su quella classe, il metodo verrà inviato a e segnalerà che non è corretto chiamarlo. È una buona cosa; impedisce di "dimenticarsene" a riguardo.

+1

La tua prima affermazione è imprecisa. Non solo la classe non ha bisogno di essere interna (le classi nidificate possono certamente essere private), ma può anche essere una classe di primo livello nella stessa unità di compilazione di un'altra classe. – chrylis

+0

Hai ragione riguardo alle classi annidate; Ho scritto "interiore" ma intendevo entrambi. Tuttavia non riesco a far funzionare il tuo secondo caso: [questo gist] (https://gist.github.com/andreabergia/6aeb123b7474a5822ef6) quando viene salvato come MainClass.java non sembra compilare. –

+0

La citazione dal libro in questione è * "privato o pacchetto-privato" * quindi anche qui si applica una classe di livello superiore privata del pacchetto nella stessa unità di compilazione. – Radiodef