Создание экземпляра внутреннего класса
Описание проблемы:
Я работаю над примером переопределения методов hashCode
и equals
, но получаю ошибку: "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)."
Я создал вложенный класс HashPerson
и сталкиваюсь с этой ошибкой, когда пытаюсь создать экземпляр этого внутреннего класса в другом методе, который называется 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");
}
На первый взгляд, код должен работать, однако я не понимаю, почему не вижу статического вложенного класса или инстанцирования внешнего класса, и это вызывает у меня замешательство. 😦
Ниже приведен полный код класса HashCodeExample
:
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;
private String name;
public HashPerson(String name) {
this.name = name;
}
public String toString() {
return name;
}
public boolean equals(Object rhs) {
if (this == rhs)
return true;
if (rhs == null || rhs.getClass() != getClass())
return false;
HashPerson other = (HashPerson) rhs;
return name.equals(other.name);
}
public int hashCode() {
int result = 0;
result = HASH_PRIME * result + name.hashCode();
return result;
}
}
}
Как мне исправить данную ошибку и корректно создать экземпляр внутреннего класса HashPerson
в статическом методе testHashCodeOverride
?
2 ответ(ов)
Я думаю, вы хотите объявить класс HashPerson
как static
. В противном случае его можно будет создавать только в контексте содержащего класса, либо в методе содержащего класса, либо с помощью кода вроде этого:
ContainingClass container = new ContainingClass();
HashPerson william = container.new HashPerson("willy");
На самом деле, моё правило — делать любые вложенные классы статическими, если у меня нет особой причины этого не делать. Это также более эффективно, поскольку нестатические вложенные классы (называемые внутренними классами) всегда содержат неявное ссылающееся на содержащий объект.
Чтобы решить вашу проблему, вам нужно либо сделать ваш внутренний класс статическим, либо обращаться к нему через экземпляр внешнего класса. В большинстве случаев вам просто нужно сделать внутренний класс статическим.
Нестатические члены класса (переменные, методы, внутренние классы) существуют для каждого экземпляра класса. Поэтому, когда вы пытаетесь получить доступ к нестатическим членам из статического контекста (например, из статического метода, такого как testHashCodeOverride
), вам необходимо указать экземпляр внешнего класса.
Внутренние классы и статические вложенные классы в Java
Инициализация ArrayList в одну строчку
Почему нет ConcurrentHashSet, если есть ConcurrentHashMap?
Создание репозитория Spring без сущности
Как сгенерировать уникальный хеш-код для строкового ввода в Android?