Много размышлений ушло на разработку Java, но иногда некоторые неоптимальные конструкции просто проскальзывают. Знаменитые Java Puzzlers ясно демонстрируют это.
Другой пакет все еще может вызывать метод с параметром package-private. Самый простой способ - передать его null
. Но не потому, что вы все еще можете это назвать, такая конструкция действительно имеет смысл. Это нарушает основную идею, стоящую за package-private : это должен видеть только сам пакет. Большинство людей согласятся, что любой код, использующий эту конструкцию, по меньшей мере сбивает с толку и просто имеет неприятный запах. Было бы лучше не допустить этого.
Как примечание, тот факт, что это разрешено, открывает еще несколько угловых случаев. Например, из другого пакета Arrays.asList(new X().getY())
компилирует, но выдает ошибку IllegalAccessError при выполнении, поскольку пытается создать массив недоступного класса Y. Это просто показывает, что эта утечка недоступных типов не вписывается в допущения, которые делает остальная часть языкового дизайна .
Но, как и другие необычные правила в Java, это было разрешено в первых версиях Java. Потому что это не такая уж большая проблема, и поскольку обратная совместимость более важна для Java, улучшение этой ситуации (запрет ее) просто больше не стоит.