Вот сценарий. Как создатель публично лицензированных API с открытым исходным кодом, моя группа создала платформу пользовательского интерфейса на основе Java (так что же еще нового?). Чтобы все было хорошо и организовано так, как нужно на Java, мы использовали пакеты с соглашением об именах org.mygroup.myframework.x, причем x - это такие вещи, как компоненты, валидаторы, конвертеры, утилиты и т. Д. (Опять же, что еще новый?).Недопустимый модификатор доступа «уровень рамки»
Теперь, где-то в классе org.mygroup.myframework.foo.Bar есть метод void doStuff()
, что мне нужно выполнить логику, специфичную для моей структуры, и мне нужно иметь возможность называть ее из нескольких других мест в моей структуре , например, org.mygroup.myframework.far.Boo. Учитывая, что Boo не является ни подклассом Bar, ни в том же пакете, метод doStuff() должен быть объявлен общедоступным, чтобы быть вызванным Boo.
Однако мои рамки существуют как инструмент, позволяющий другим разработчикам создавать более простые и элегантные R.I.A.s для своих клиентов. Но если com.yourcompany.yourapplication.YourComponent называет doStuff(), это может иметь неожиданные и нежелательные последствия. Я бы предпочел, чтобы этого никогда не было позволено. Обратите внимание, что в Bar содержатся другие методы, которые действительно общедоступны.
В мире башни из слоновой кости мы переписываем язык Java и вставляем токенированный аналог в стандартный доступ, который позволит любому классу в структуре пакета по нашему выбору получить доступ к моему методу, возможно, похоже на:
[org.mygroup.myframework.*] void doStuff() { .... }
где подстановочные будет означать любой класс, пакет начинается с org.mygroup.myframework может позвонить, но никто другой.
Учитывая, что этого мира не существует, какие еще хорошие варианты у нас есть?
Обратите внимание, что это мотивировано реальным сценарием; имена были изменены для защиты виновных. Существует реальная основа, в которой на всем протяжении своего Javadoc можно найти общие методы, которые комментируются как «ЭТОТ МЕТОД ВНУТРЕННЕГО ДЛЯ MYFRAMEWORK И НЕ ЧАСТЬ ЕГО ПУБЛИЧНОГО API. НЕ ЗВОНИТЕ !!!!!!» Небольшое исследование показывает, что эти методы вызываются из других источников в рамках.
По правде говоря, я разработчик, использующий рассматриваемую структуру. Хотя наше приложение развернуто и имеет успех, моя команда испытала так много проблем, что мы хотим убедить наших боссов, чтобы никогда больше не использовать эту структуру. Мы хотим сделать это в хорошо продуманной презентации плохих дизайнерских решений, сделанных разработчиками структуры, а не просто как напыщенная речь. Эта проблема будет одной (из нескольких) наших точек, но мы просто не можем сказать, как мы могли бы сделать это по-другому. На моем рабочем месте уже была оживленная дискуссия, поэтому я подумал, что подумает остальной мир.
Update: Не обижайтесь к двум отвечающими до сих пор, но я думаю, что вы промахнулись, или я не выразить это хорошо. В любом случае, я могу попытаться осветить вещи. Постарайтесь, как я могу, как разработчикам фреймворка было реорганизовано следующее. Обратите внимание, что это очень грубый пример.
package org.mygroup.myframework.foo;
public class Bar {
/** Adds a Bar component to application UI */
public boolean addComponentHTML() {
// Code that adds the HTML for a Bar component to a UI screen
// returns true if successful
// I need users of my framework to be able to call this method, so
// they can actually add a Bar component to their application's UI
}
/** Not really public, do not call */
public void doStuff() {
// Code that performs internal logic to my framework
// If other users call it, Really Bad Things could happen!
// But I need it to be public so org.mygroup.myframework.far.Boo can call
}
}
Еще одно обновление: Я только что узнал, что C# имеет "внутренний" модификатор доступа. Поэтому, возможно, лучший способ сформулировать этот вопрос мог бы быть следующим: «Как имитировать/эмулировать внутренний доступ в Java?» Тем не менее, я не ищу новых ответов.Наш босс в конечном итоге согласился с упомянутыми выше проблемами
Звучит как отличный случай для разделения вашего публичного API и реализации на отдельные проекты с публичным API, состоящим из большого количества интерфейсов. – Perception
@Перцепция: Я считаю, что это то, что делает JSF, с отдельными jsf-api.jar и jsf-impl.jar. – cobaltduck
'Существует реальная структура, в которой на всем протяжении своего Javadoc можно найти общедоступные методы, прокомментированные как ...« Хм, мне интересно, какая структура может быть :)) – biziclop