Ну, в общем, вы хотите сделать 3 вещи:
- сделать метод setAsset видимым внутри пакета, содержащего класс Asset
- скрыть метод setAsset от всех других пакетов
- не используйте подпакеты для достижения этого
Это немного проблематично: если вы объявите public этот метод в классе Attribute для всех других классов, включая этот пакет (назовем его AttributePackage), вы не сможете запретить пользователю включать где-то этот пакет.
С другой стороны, вы можете сделать следующее:
- создать интерфейс, содержащий только метод Attribute, который должен использовать пользователь, назовем его AttributeInterface
- заставит Атрибут реализовать этот интерфейс
- добавить AttributeInterface в новый пакет
Пользователь, который хочет использовать класс Attribute, должен использовать его через AttributeInterface.
Asset будет использовать класс Attribute напрямую, чтобы иметь доступ ко всем методам.
Я приведу пример:
//attribute interface package
public interface AttributeInterface{
public void publicAttributeMethodClientShouldUse();
}
//attribute package
public class Attribute{
public void setAsset(Asset a);
public void publicAttributeMethodClientShouldUse();
}
Актив будет ссылаться непосредственно на Атрибут, а пользователь должен ссылаться на Атрибут. Надеюсь, что будет ясно.