У меня есть объект, который приходит и имеет кучу общедоступных атрибутов, а не геттеры и сеттеры. ПЛОХО! Поэтому я создал класс с атрибутами и создал для них геттеры и сеттеры. Мой план состоит в том, чтобы обернуть объект в моем классе, чтобы не было прямого доступа к атрибутам. Я немного не уверен, как это сделать. Я прекрасно понимаю литье. Как именно я могу обернуть класс своим безопасным классом с геттерами и сеттерами и получить доступ к атрибутам через мои геттеры и сеттеры?
упаковка объекта
Ответы (3)
Может вот так?
class MyCar implements ICar{
private final Car car;
public MyCar(Car car)
{
this.car = car;
}
public string getModel()
{
return car.model;
}
public void setModel(string value)
{
car.model = value;
}
}
теперь вместо того, чтобы передавать экземпляр Car
, вы можете либо передать экземпляр MyCar
, который имеет геттеры и сеттеры, либо ссылку на ICar
, которая позволит вам точно контролировать то, что вы хотите выставить (например, вы можете просто выставить геттеры).
Используйте композицию. Если ваш класс с общедоступными свойствами называется Exposed, просто выполните
public class ExposedProtector {
private Exposed exposed; // private means it can't be accessed directly from its container
//public/protected methods here to proxy the access to the exposed.
}
Обратите внимание, что ничто не помешает другим людям создавать экземпляры Exposed. Вам придется изменить фактический открытый класс, что может быть лучшим способом сделать это, если это возможно.
Вы должны посмотреть на модификаторы доступа java. Существуют различные уровни доступа: от частного до защищенного и общедоступного.
Если вы хотите, чтобы ваш класс был совместимым с исходным классом (это означает, что клиентский код не должен изменять типы переменных), тогда ваш класс должен быть подклассом класса, который ожидает клиентский код. В этом случае вы не можете скрыть общедоступные переменные, хотя вы можете легко добавить геттеры и сеттеры. Однако даже если вы создадите подкласс, это не поможет, если у исходного класса есть другие подклассы; они не увидят этих геттеров и сеттеров.
Если вы можете ввести несвязанный класс, то решение состоит в том, чтобы делегировать все:
public class BetterThing {
private Thing thing;
public BetterThing(Thing thing) {
this.thing = thing;
}
public int getIntProperty1() {
return thing.property1;
}
public void setIntProperty1(int value) {
thing.property1 = value;
}
// etc.
}