Я разрабатываю игровой движок в Java.
В основе этого механизма существуют два класса Asset и Attribute, где Asset имеет список атрибутов. Большинство атрибутов не требуют ссылки на свой атрибут, что означает, что атрибуты могут и часто появляются в списках более чем одного объекта. Тем не менее, существует расширение атрибута UniqueAttribute, который является реализацией для тех, которые являются специфическими для их Asset, и использовать ссылку назад.
-
В идеале мой метод addAttribute объекта будет выглядеть примерно так, если я вырезаю другой код:
public void addAttribute(Attribute attribute){ if(attribute instanceof UniqueAttribute) ((UniqueAttribute)attribute).setAsset(this); attributeList.add(attribute); }
К сожалению, поскольку они живут в разных пакетах, UniqueAttribute.setAsset() должен быть общедоступным. Это оставляет метод открытым для внешних пользователей движка, с которым можно было бы взаимодействовать, и хотя я мог просто отбросить его, сказав, что использование этого метода напрямую является ошибкой - кажется довольно неряшливым.
-
Второй вариант - предоставить UniqueAttribute с помощью Asset on construction, что означает, что код в точке создания будет выглядеть примерно так:
asset.addAttribute(new UniqueAttribute(asset));
В то время как я могу добавить check-and-throwable или assert для подтверждения того, что правильный актив передан, я в основном полагаюсь на пользователя для подключения двух, что я также предпочел бы не делать.
-
Третий вариант - укусить пулю и поместить 50 Java файлов в один и тот же пакет, чтобы я мог просто использовать стандартную видимость.
Есть ли какой-то шаблон или что-то, что поможет связать эти два вместе, не подвергая проводам, или заставляя меня вкладывать все в один массивный пакет?
Неповторимое разглашение: мне всегда было неловко, что концепция подпакетов в java действительно не была расширена каким-либо значимым образом. Подпакет, поскольку речь идет о java, - это просто другой пакет, и было много случаев, когда я мог делать с более важными модификаторами видимости, связанными с этим.