Некоторые языки и среды выполнения (например, Java, .NET) предполагают, что любому, кто компилирует код для определенного класса, можно доверять, чтобы он не использовал закрытые члены любого экземпляра этого класса способами, которые могли бы нанести ущерб его правильному операция. Другие языки и структуры являются более строгими в этом отношении и не разрешают доступ к закрытым членам экземпляра, за исключением кода, выполняемого в этом экземпляре . Обе конструкции имеют свои преимущества и недостатки.
Самое большое преимущество предоставления любому коду в классе доступа к закрытым членам любого экземпляра состоит в том, что существуют случаи, когда этот уровень доступа является подходящим, и такая private
работа устраняет необходимость либо иметь другой квалификатор доступа, доступный для этой цели, либо иначе заставьте код выставлять членов более широко, чем было бы в идеале.
Преимущество запрета такого доступа (как в случае с Общей объектной моделью Microsoft (COM)) заключается в том, что он позволяет внешнему коду обрабатывать классы как интерфейсы. Если класс ImmutableMatrix
содержит закрытое или защищенное double[][]
вспомогательное поле и если код внутри класса проверяет вспомогательный массив других экземпляров, то будет невозможно определить класс без поддержки массива (например ZeroMatrix
, IdentityMatrix
), который внешний код может использовать как Immutable2dMatrix
, без этого класса , имеющего в том числе в области подложки. Если ничто внутри не Immutable2dMatrix
использует закрытые члены какого-либо экземпляра, кроме this
, то можно было бы переименовать класс в ImmutableArrayBackedMatrix
и определить новый абстрактный ImmutableMatrix
класс, который мог бы иметь ImmutableArrayBackedMatrix
так же, как и вышеупомянутые классы без поддержки массива, в качестве подтипов.
Обратите внимание, что такой рефакторинг не мог бы быть предотвращен, если бы язык «позволял» ImmutableMatrix
проверять массив резервных копий для других this
случаев, кроме случаев, когда язык использовал эту возможность и фактически проверял внешние экземпляры. Основной эффект ограничения языка таким использованием заключается в том, что компилятор немедленно закричит при любой попытке написать код, который не поддается такому рефакторингу.
equals
, это проверка личных полей другого экземпляра. (Публикация в качестве комментария, так как это коротко, и ничего об ООП-