Мне было интересно, почему Java была разработана без директивы friend
, доступной на C++, чтобы обеспечить более точное управление тем, какие методы и переменные экземпляра доступны извне пакета, в котором был определен класс.Почему директива friend отсутствует на Java?
Я не вижу никакой практической причины или какого-либо конкретного недостатка, это просто проблема дизайна, но что-то, что не создавало бы проблем, если бы оно было добавлено к языку.
+1 для инкапсуляции :) – fresskoma
-1 для инкапсуляции. Это распространенное недоразумение. Это просто неправильно. Хотя верно, что 'friend' * * может использоваться для разрыва инкапсуляции, так что другие функции могут быть использованы неправильно. Используется правильно, инкапсуляция 'friend' * увеличивает *, потому что она позволяет более мелкозернистый контроль доступа:' friend' заменяет использование 'public', а не' private'. [Техническое объяснение на C++ FAQ] (http://www.parashift.com/c++-faq-lite/friends.html#faq-14.2) (Тем не менее, я полностью удовлетворен видимостью пакета, но утверждая, что 'friend 'breaks encapsulation все еще не так.) –
@ KonradRudolph Абсолютно согласен. Классы друзей необходимы для разделения проблем. Например, у меня есть класс «Сериализатор», который должен быть разрешен для записи в поля экземпляра, поэтому я предоставляю ему доступ для друзей. Другие классы не могут специально писать в поля и должны проходить через интерфейс, который я предоставляю. Единственный способ, которым вы можете это сделать в Java, - поместить все в один и тот же пакет. – crush