Sobes.tech
Назад к вопросам
Junior — Middle
65

Можно ли применять объекты, не являющиеся строками, в качестве ключей, делая их неизменяемыми?

Ответ от нейросети

sobes.tech AI

В Android (и Java в целом) в качестве ключей в коллекциях, например, в HashMap, можно использовать объекты любых типов, не только строки. Главное — чтобы эти объекты корректно реализовывали методы equals() и hashCode().

Если объект изменяемый и его поля, участвующие в вычислении хэш-кода или сравнении, изменятся после помещения в коллекцию, это приведёт к некорректной работе коллекции (например, ключ станет недоступен).

Поэтому, чтобы использовать объекты в качестве ключей, рекомендуется делать их неизменяемыми (immutable). Например, использовать final поля и не предоставлять сеттеры. Это гарантирует, что хэш-код и равенство не изменятся после создания объекта.

Пример:

public final class Key {
    private final int id;
    private final String name;

    public Key(int id, String name) {
        this.id = id;
        this.name = name;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Key)) return false;
        Key key = (Key) o;
        return id == key.id && name.equals(key.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, name);
    }
}

Таким образом, можно использовать объекты любых типов в качестве ключей, если они неизменяемы и корректно реализуют equals и hashCode.