Istigazione della class interiore

Sto lavorando su un problema di esempio di sovrascrivere il metodo hashCode e equals ma ottenendo un errore: ” Nessuna istanza di inclusione di tipo CustomHashCodeExample è accessibile. Deve qualificare l’allocazione con un’istanza che racchiude di tipo CustomHashCodeExample (egxnew A () dove x è un’istanza di CustomHashCodeExample). “Ho scritto una class interna HashPerson e sto ricevendo questo errore quando sto provando a creare un’istanza di questa class interna in un altro metodo chiamato testHashCodeOverride ().

public static void testHashCodeOverride(){ System.out.println("\nTest HashCode Override Method"); System.out.println("==================================\n"); HashPerson william = new HashPerson("willy"); HashPerson bill = new HashPerson("willy"); } 

Questo codice funziona bene, anche se non vedo la class interna statica o l’istanza della class esterna, confuso 🙁

 public class HashCodeExample { public static void testHashCodeOverride() { HashPerson william = new HashPerson("Willy"); HashPerson bill = new HashPerson("Willy"); System.out.println("Hash code for william = " + william.hashCode()); System.out.println("Hash code for bill = " + bill.hashCode()); HashMap table = new HashMap(); table.put(william, "Silly"); if (table.containsKey(william)) { System.out.println(table.get(william)); } else { System.out.println("Key " + william + " not found"); } if (table.containsKey(bill)) { System.out.println(table.get(bill)); } else { System.out.println("Key " + bill + " not found"); } } class HashPerson { private static final int HASH_PRIME = 1000003; public HashPerson(String name) { this.name = name; } public String toString() { return name; } public boolean equals(Object rhs) { if (this == rhs) return true; // make sure they are the same class if (rhs == null || rhs.getClass() != getClass()) return false; // ok, they are the same class. Cast rhs to HashPerson HashPerson other = (HashPerson) rhs; // our test for equality simply checks the name field if (!name.equals(other.name)) { return false; } // if we get this far, they are equal return true; } public int hashCode() { int result = 0; result = HASH_PRIME * result + name.hashCode(); return result; } private String name; } } 

Penso che tu voglia dichiarare la class HashPerson come static . Altrimenti può essere istanziato solo nel contesto della class contenitore, in un metodo della class contenitore o usando un codice come questo:

 ContainingClass container = new ContainingClass(); HashPerson william = container.new HashPerson("willy"); 

In realtà, la mia regola empirica è di rendere statiche tutte le classi annidate, a meno che non abbia una ragione speciale per non farlo. Questo è anche più efficiente, perché le classi annidate non statiche (chiamate classi interne ) contengono sempre un riferimento implicito all’object contenitore.

È necessario rendere statica la class interna o fare riferimento ad essa attraverso un’istanza della class esterna. Molto probabilmente vuoi solo rendere statica la tua class interiore.

I membri non statici di una class (variabili, metodi, classi interne) sono per istanza della class. Pertanto, quando si accede a membri non statici da un contesto statico (come un metodo statico come testHashCodeOverride ), è necessario specificare un’istanza della class di testHashCodeOverride .