Публичный доступ по умолчанию в Scala - PullRequest
14 голосов
/ 11 января 2011

Я прочитал, что в scala нет закрытого пакета (по умолчанию в Java), и по умолчанию использую открытый доступ.

Каковы причины этого выбора? Является ли это хорошей практикой, так как общедоступный доступ по умолчанию делает все видимым, следовательно, частью API?

Это означает дополнительную типизацию для инкапсуляции полей и методов (будь то приватный, закрытый, защищенный, доступный).

Ответы [ 4 ]

26 голосов
/ 11 января 2011

В Java гораздо проще выбрать «частный пакет» в качестве значения по умолчанию, потому что это одна из трех возможностей.

В Scala вы можете выбрать между общедоступным доступом (public), приватным доступом к пакету с наследованием (protected[C]), приватным доступом к пакету без наследования (private[C]), приватным доступом к классу (private) , объектно-частный доступ (private[this]), доступ к наследованию (protected), protected[this] доступ (как бы вы это ни называли) и, кроме того, у вас есть какой-то модификатор доступа к файлу (sealed).

Трудно выбрать значение по умолчанию, отличное от public.

(Учитывая внутренние методы, можно также добавить method-private в список…)

5 голосов
/ 12 января 2011

Scala обладает гораздо большей гибкостью в выборе видимости чего-либо, чем Java, хотя некоторые правила видимости Java, связанные с вложенными классами, не переводятся в Scala.

И, да, в Scala есть пакетный приват. Это написано как private[package] в Scala.

Причина, по которой Scala устанавливает значение public по умолчанию, заключается в том, что он используется чаще всего. «Дополнительная типизация» - это на самом деле меньше наборов, потому что гораздо реже делать членов закрытыми или защищенными.

Единственным исключением из этого правила в Java являются поля, которые должны быть приватными, чтобы можно было изменять детали реализации, не нарушая клиентов. Одним практическим следствием этого являются классы с полями, а затем методы получения и установки для каждого поля.

В Scala, поскольку можно заменить val или var на def, в этом нет необходимости.

2 голосов
/ 11 января 2011

Это то, что доставляет многим людям неприятности. Я бы предложил эту запись (фактически всю серию) прочитать.

Неизменность также предотвращает любые забавы, которые обычно возникают при таком доступе. Возможно, это правда, что «здесь больше печатания», но, глядя на IDE, они несут большую ответственность, поскольку любой сгенерированный в IDE метод обычно общедоступен, что также не всегда допустимо.

1 голос
/ 11 января 2011

Согласно Programming Scala , кажется, что общедоступный по умолчанию в основном из-за принципа унифицированного доступа , где перегрузка оператора позволяет определить геттер как field = newvalue

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...