Доступ к закрытым полям пакета в классах, общих для всех проектов Eclipse
У меня есть класс модели ( шаблон MVC), который я использую в двух проектах Eclipse.
Один проект, давайте назовем это Producer
, захватывает данные из потока и сохраняет их в базе данных. Модельный класс, о котором идет речь, скажем ObjectModel
, используется для десериализации потока для манипуляций перед сериализацией и сохранением в БД.
Еще один проект, назовем его Consumer
, извлекает данные, хранящиеся в базе данных, и визуализирует их на экране. Он использует тот же класс модели для десериализации хранимых данных для использования в приложении визуализации.
Я планировал поставить ObjectModel
в проект Eclipse, чтобы поделиться своим источником через Producer
а также Consumer
проекты. Тем не менее, каждое приложение имеет классы, которые в настоящее время находятся в одном и том же пакете, которые используют модификатор доступа private-package для получения и установки полей в ObjectModel
,
Есть ли способ, которым я могу поделиться источником между несколькими проектами Eclipse и по-прежнему поддерживать частный доступ к пакету с общим источником?
ОБНОВЛЕНИЕ: у меня были проблемы с распространением кода между проектами Eclipse, поэтому я не просто попробовал это перед публикацией. Наконец-то эта часть заработала, и записал ее как еще один ответ здесь.
2 ответа
Пока классы в проектах Producer и Consumer объявлены в том же пакете, что и ObjectModel, все они должны просто работать.
Однако вы можете переосмыслить свой дизайн и предоставить общедоступные методы доступа (методы получения и установки) в ObjectModel.
Посмотрите ответ @GreyBeardedGeek выше:
Пока классы в проектах Producer и Consumer объявлены в том же пакете, что и ObjectModel, все они должны просто работать.
Вы ищете друга на C++ в Java. В общем, это может быть признаком неправильного дизайна. Если ваш дизайн в порядке, то использование "частного доступа к пакету" является стандартным способом Java для реализации друзей. Технически это будет работать, если ваши классы находятся в разных проектах... Если вы считаете, что ваш дизайн в порядке, возможно, вы хотели бы рассмотреть возможность использования *Heper class. Например:
public class SomeClass {
void foo(){...
}
}
public class SomeClassHelper {
private SomeClass someClass;
public SomeClassHelper(SomeClass someClass){
//you can do it better this with some DI Framework,
//for illustration purpose
this.someClass=someClass;
}
public SomeClassHelper(){
//for illustration purpose only
this.someClass=new SomeClass();
}
**public** void foo(){
//this is punch line
someClass.foo();
}
}
Вы должны поместить SomeClassHelper в тот же пакет, что и SomeClass, но SomeClassHelper может находиться в другой исходной папке или проекте.