Подтвердить что ты не робот

Java: доступ к закрытым полям непосредственно из другого экземпляра того же класса

Я пишу функцию equals(Object obj) для класса. Я вижу, что можно получить доступ к закрытым полям obj от вызывающего. Поэтому вместо использования getter:

Odp other = (Odp) obj;
if (! other.getCollection().contains(ftw)) {

}

Я могу просто получить доступ к полю напрямую:

Odp other = (Odp) obj;
if (! other.collection.contains(ftw)) {

}

Является ли эта плохая практика?

4b9b3361

Ответ 1

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

Если вы используете частные переменные других объектов, которые ничего не мешают, потому что, если вы изменили структуру своего класса, вам все равно придется менять код внутри класса.

Ответ 2

Я обычно использую геттеры, потому что иногда геттер - это не просто "return (foo)". Иногда они инициализируют вещи, если они имеют нулевое значение, или имеют некоторые протоколы отладки в них или каким-то образом проверяют текущее состояние. Это более последовательное.

Ответ 3

Я не думаю, что это плохая практика, но особенность языка. Это не только позволяет вам протестировать equals так, как вы это делаете, но также полезно в шаблоне Prototype для создания объекта.

Ответ 4

Это нормально и совершенно нормально. Немного странно думать, что this может играть с закрытыми полями other, но все в порядке, потому что нет ничего плохого в том, что какая-то третья сторона может отбросить объект Odp внутренности. Любой метод класса Odp может модифицировать любые частные члены любого объекта Odp, даже не this, но это прекрасно, поскольку любые такие методы, очевидно, можно доверять!

Ответ 5

Это дублирование

Почему я могу получить доступ к своим личным переменным из" other " объект прямо в моем методе equals (Object o)

Личные данные доступны любому экземпляру этого класса, даже если один экземпляр класса A обращается к частным членам другого экземпляра A. Важно помнить, что модификаторы доступа (private, protected, public) контролируют класс доступ, а не доступ к экземплярам

Ответ 6

Использование частного члена для класса сущности может привести к неправильной работе прокси-класса. Представьте, что hibernate создает класс по ленивому запросу. Если вы проверяете переменную-член, она возвращает null. Но если вы вызываете get(), он будет извлекать данные из базы данных и инициализировать поле.