опаковане на обект

Имам обект, който идва и има куп публични атрибути и няма гетери и сетери. ЛОШО! Така че създадох клас с атрибутите и създадох гетери и сетери за тях. Моят план е да обвия обекта в моя клас, така че да няма директен достъп до атрибути. Не съм сигурен как да направя това. Разбирам кастинга добре. Как точно мога да обвия класа с моя безопасен клас с гетери и сетери и да получа достъп до атрибутите чрез моите гетери и сетери?


person Will    schedule 26.05.2011    source източник
comment
Не можете ли просто да изхвърлите обекта, който има много публични атрибути, и да използвате вашия клас с частни атрибути и getters/setter (т.е. Java bean)? Без опаковане.   -  person MarcoS    schedule 26.05.2011
comment
прост начин създайте променлива за референтен тип за обекта, който получавате, и генерирайте гетери и сетери. Разширеният начин използвайте api за отражение или dyna beans, разширеният начин е много сложен и не се препоръчва да се използва, когато можете да изпълнявате нещата по прост начин   -  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

Ако искате вашият клас да бъде plug-совместим с оригиналния клас (което означава, че клиентският код не трябва да променя типовете променливи), тогава вашият клас ще трябва да бъде подклас на класа, който клиентският код очаква. В този случай не можете да скриете публичните променливи, въпреки че можете лесно да добавите гетери и сетери. Дори ако направите подклас, това няма да помогне, ако оригиналният клас има други подкласове; те няма да видят тези гетери и сетери.

Ако можете да въведете несвързан клас, тогава решението е да делегирате всичко:

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