Java: доступ к закрытым полям напрямую из другого экземпляра того же класса - PullRequest
11 голосов
/ 10 октября 2009

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

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

}

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

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

}

Это плохая практика?

Ответы [ 6 ]

9 голосов
/ 10 октября 2009

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

6 голосов
/ 10 октября 2009

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

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

5 голосов
/ 10 октября 2009

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

1 голос
/ 02 июля 2013

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

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

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

1 голос
/ 10 октября 2009

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

0 голосов
/ 02 ноября 2012

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

...