2011-05-26 28 views
3

我有一个对象,它有一堆公共属性,没有getter和setters。坏! 所以我创建了一个具有属性的类并为它们创建了getter和setter。我的计划是将对象包装在我的课程中,这意味着不能直接访问属性。 我有点不确定如何做到这一点。我明白投球很好。 我该如何将我的安全类与getter和setter打包并通过getters和setter访问属性?环绕一个对象

+1

不能你只是扔掉有很多公共属性的对象,并使用你的类私有属性和getters/setters(即Java bean)?没有包装。 – MarcoS 2011-05-26 12:56:35

+0

简单的方法为您正在接收的对象创建一个引用类型变量,并使getter和setter成为genrate。先进的方式使用反射api或dyna豆先进的方式是非常复杂的,不建议使用时,你可以用简单的方式执行的东西 – Mateen 2015-01-08 08:38:46

回答

6

也许这样?

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实例,它具有getter和setter或ICar的参考,这将让你控制你想暴露什么(比如你可能只是暴露了吸气剂)。

+0

包装和封装有什么区别? – Lealo 2017-10-05 01:23:34

3

使用组合物。如果你与公共财产类别称为暴露,只要做

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. 



} 

请注意,没有什么会阻止其他人创建实例的暴露。如果可能的话,您将不得不修改实际暴露的类本身,这可能是更好的方法。

你应该看看java访问修饰符。从私人到受保护的公共场所都有不同的访问级别。

2

如果您希望您的类与原始类(即客户端代码不需要更改变量类型)进行插件兼容,那么您的类必须是客户端代码期望的类的子类。在这种情况下,虽然可以轻松添加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. 
}