0

Создание экземпляра внутреннего класса

9

Описание проблемы:

Я работаю над примером переопределения методов 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 ответ(ов)

1

Я думаю, вы хотите объявить класс HashPerson как static. В противном случае его можно будет создавать только в контексте содержащего класса, либо в методе содержащего класса, либо с помощью кода вроде этого:

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

На самом деле, моё правило — делать любые вложенные классы статическими, если у меня нет особой причины этого не делать. Это также более эффективно, поскольку нестатические вложенные классы (называемые внутренними классами) всегда содержат неявное ссылающееся на содержащий объект.

0

Чтобы решить вашу проблему, вам нужно либо сделать ваш внутренний класс статическим, либо обращаться к нему через экземпляр внешнего класса. В большинстве случаев вам просто нужно сделать внутренний класс статическим.

Нестатические члены класса (переменные, методы, внутренние классы) существуют для каждого экземпляра класса. Поэтому, когда вы пытаетесь получить доступ к нестатическим членам из статического контекста (например, из статического метода, такого как testHashCodeOverride), вам необходимо указать экземпляр внешнего класса.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь