t0mcat t0mcat - 1 month ago 11
Java Question

Instantiating inner class

I working on a sample problem of over-ridding hashCode and equals method but getting an error: "No enclosing instance of type CustomHashCodeExample is accessible. Must qualify the allocation with an enclosing instance of type CustomHashCodeExample (e.g. x.new A() where x is an instance of CustomHashCodeExample)."
I wrote an inner class HashPerson and I am getting this error when I am trying to instantiate this inner class in another method called 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");
}


This code works fine, even though I dont see static inner class or instantiation of outer class, confused :(

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;

}
}

Answer

I think you want to declare the HashPerson class as static. Otherwise it can only be instantiated in the context of the containing class, either in a method of the containing class or using code like this:

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

Actually, my rule-of-thumb is to make any nested class static, unless I have a special reason not to. This is also more efficient, because non-static nested classes (called inner classes) always contain an implicit reference to the containing object.

Comments