упаковка объекта

У меня есть объект, который приходит и имеет кучу общедоступных атрибутов, а не геттеры и сеттеры. ПЛОХО! Поэтому я создал класс с атрибутами и создал для них геттеры и сеттеры. Мой план состоит в том, чтобы обернуть объект в моем классе, чтобы не было прямого доступа к атрибутам. Я немного не уверен, как это сделать. Я прекрасно понимаю литье. Как именно я могу обернуть класс своим безопасным классом с геттерами и сеттерами и получить доступ к атрибутам через мои геттеры и сеттеры?


person Will    schedule 26.05.2011    source источник
comment
Разве вы не можете просто выбросить объект, имеющий множество общедоступных атрибутов, и использовать свой класс с частными атрибутами и геттерами/сеттерами (например, Java-бином)? Нет упаковки.   -  person MarcoS    schedule 26.05.2011
comment
простой способ создать переменную ссылочного типа для объекта, который вы получаете, и создать геттеры и сеттеры. Расширенный способ использования API-интерфейса отражения или компонентов Dyna. Расширенный способ очень сложен, и его не рекомендуется использовать, когда вы можете выполнять действия простым способом.   -  person Mateen    schedule 08.01.2015


Ответы (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, которая позволит вам точно контролировать то, что вы хотите выставить (например, вы можете просто выставить геттеры).

person Bala R    schedule 26.05.2011
comment
В чем разница между обертыванием и инкапсуляцией? - person Lealo; 05.10.2017

Используйте композицию. Если ваш класс с общедоступными свойствами называется 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. Существуют различные уровни доступа: от частного до защищенного и общедоступного.

person hvgotcodes    schedule 26.05.2011

Если вы хотите, чтобы ваш класс был совместимым с исходным классом (это означает, что клиентский код не должен изменять типы переменных), тогда ваш класс должен быть подклассом класса, который ожидает клиентский код. В этом случае вы не можете скрыть общедоступные переменные, хотя вы можете легко добавить геттеры и сеттеры. Однако даже если вы создадите подкласс, это не поможет, если у исходного класса есть другие подклассы; они не увидят этих геттеров и сеттеров.

Если вы можете ввести несвязанный класс, то решение состоит в том, чтобы делегировать все:

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.
}
person Ted Hopp    schedule 26.05.2011