如果没有在get()set()模型中使用get(),有没有办法获得只读功能?

时间:2012-12-16 15:18:40

标签: java oop private

拥有get set模型:     

public class exampleclass
{
    private Something something;

    public Something getSomething()
    {
        return something;
    }

    public void setSomething(Something st)
    {
         something = st;
    }
}

我想做这样的事情:

public class exampleclass
{
    public Something something;

    public void setSomething(Something st)
    {
         something = st;
    }
}

但是我希望在类之外使用 readOnly 功能来“改变某些东西”(但可以在自己的类中重写)。知道如何为优化访问做到这一点。 (想想这将在android中使用,但使用纯java框架(libgdx))

3 个答案:

答案 0 :(得分:3)

您可以在构造函数中设置thoose并公开public final字段:

public class ExampleClass
{
    public final Something something;

    public ExampleClass(Something st)
    {
         something = st;
    }
}

答案 1 :(得分:0)

您可以使用final关键字。 你可以分配一次。

e.g

public class Exampleclass
{
    public final Something something;
    void Exampleclass(Something init) {
        this.something = init;
    }
}

然而,Something的内容仍然可以更改,因此您可以考虑返回某事的clone()。 (请参阅类java.util.Date,您仍然可以设置时间戳,在这种情况下只有clone()或复制构造函数帮助)。但是如果你的代码不是公共lib,那么你可以通过clone()离开

来获取getter
public class Exampleclass
    {
        private Something something;
        void Exampleclass(Something init) {
            this.something = init;
        }
       void Something getSomething() {
            return something.clone();
        }

    }

但这取决于某事。 另一个灵魂是Factory Pattern,只有Factory才能创建Something。 然后public constructor中没有Something。只有工厂可以创建它。

public class Something() {
   private int value;
   protectectd Something(int value) {
      this.value = value;
   }
   public tostring() {
      System.out.println("values = " + value);
   }
}
public class SomethingFactory() {
  protected static Someting createSomething(int value)  {
     return new Something(value);   
 }
}

USage:

Something some = SomethingFactory.createSomething(3);

但是通过搜索“java Deisgn Patterns Factory”或FactoryPattern

阅读更多内容

答案 2 :(得分:0)

我想您的问题是转义引用,如果要在返回时保存对象,请发送引用副本,则可以使用clone方法发送克隆的对象。

public Something getSomething()
{
    return something.clone();
}

这将返回对象浅表副本,如果您想进行深克隆,请覆盖clone()方法,希望对您有所帮助。