Имам обект, който идва и има куп публични атрибути и няма гетери и сетери. ЛОШО! Така че създадох клас с атрибутите и създадох гетери и сетери за тях. Моят план е да обвия обекта в моя клас, така че да няма директен достъп до атрибути. Не съм сигурен как да направя това. Разбирам кастинга добре. Как точно мога да обвия класа с моя безопасен клас с гетери и сетери и да получа достъп до атрибутите чрез моите гетери и сетери?
опаковане на обект
Отговори (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. Има различни нива на достъп, от личен през защитен до публичен.
Ако искате вашият клас да бъде 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.
}