упаковка объекта - PullRequest
       27

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

3 голосов
/ 26 мая 2011

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

Ответы [ 3 ]

6 голосов
/ 26 мая 2011

Может быть, вот так?

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

3 голосов
/ 26 мая 2011

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

2 голосов
/ 26 мая 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.
}
...