包装一个对象

5

我有一个对象,它具有一堆公共属性,但没有getter和setter。这很糟糕!因此,我创建了一个类,为其属性创建了getter和setter。我的计划是在我的类中包装该对象,这意味着不能直接访问属性。 我不太确定如何做到这一点。我很好地理解了强制转换。 我应该如何使用我的安全类包装该类,并通过我的getter和setter访问属性?


2
你不能简单地丢弃具有许多公共属性的对象,而是应该使用具有私有属性和getters/setters(即Java bean)的类吗?不包装。 - MarcoS
创建一个引用类型变量来接收对象并生成getter和setter的简单方法。高级方法使用反射API或动态Bean,但这种高级方法更加复杂,建议在可以使用简单方法时不要使用。 - Mateen
3个回答

8
也许是这样的吗?
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 实例,你可以传递一个具有 getters 和 setters 的 MyCar 实例或者一个对 ICar 的引用,这将让你完全控制你想要暴露的内容(例如,你可以只暴露 getters)。


封装和包装有什么区别? - Lealo

3
使用组合。如果你的公共属性类名为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的实例。如果可能的话,您需要修改Exposed类本身,这可能是更好的方法。

您应该查看Java访问修饰符。有不同级别的访问控制,从private到protected到public。


3
如果您希望您的类与原始类兼容(意味着客户端代码不需要更改变量类型),那么您的类将必须是客户端代码期望的类的子类。在这种情况下,您无法隐藏公共变量,尽管您可以轻松添加getter和setter。但是,即使您继承了原始类,如果原始类有其他子类,则它们将看不到这些getter和setter。
如果您可以引入一个不相关的类,那么解决方案就是委托一切:
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.
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接