Java 有没有办法在get()set()模型中使用readonly特性而不使用get()?

Java 有没有办法在get()set()模型中使用readonly特性而不使用get()?,java,oop,private,Java,Oop,Private,具有获取集模型: 我想做这样的东西: public class exampleclass { public Something something; public void setSomething(Something st) { something = st; } } 但是我想在类之外有一个带有只读特性的“something”var(但是可以在自己的类中重写)。任何关于如何实现优化访问的想法。(假设这将在android中使用,但是使用纯j

具有获取集模型:

我想做这样的东西:

public class exampleclass
{
    public Something something;

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

但是我想在类之外有一个带有只读特性的“something”var(但是可以在自己的类中重写)。任何关于如何实现优化访问的想法。(假设这将在android中使用,但是使用纯java纯框架(libgdx))

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

e、 g

但是有些东西的内容仍然可以改变,所以你可以考虑返回某物的克隆()。(参见java.util.Date类,您仍然可以设置时间戳,在这种情况下,只有clone()或copy构造函数有帮助)。但是,如果您的代码不是公共库,那么您可以使用clone()离开getter

但这取决于一些事情。 另一个解决方案是
工厂模式
,这样只有
工厂
可以创建
一些东西
。 然后在
某物中没有
公共构造函数。只有工厂才能创建它

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);   
 }
}
用法:

Something some = SomethingFactory.createSomething(3);

但是通过搜索“java Deisgn Patterns Factory”或FactoryPattern可以阅读更多内容,您可以使用final关键字。 您可以将其分配一次

e、 g

但是有些东西的内容仍然可以改变,所以你可以考虑返回某物的克隆()。(参见java.util.Date类,您仍然可以设置时间戳,在这种情况下,只有clone()或copy构造函数有帮助)。但是,如果您的代码不是公共库,那么您可以使用clone()离开getter

但这取决于一些事情。 另一个解决方案是
工厂模式
,这样只有
工厂
可以创建
一些东西
。 然后在
某物中没有
公共构造函数。只有工厂才能创建它

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);   
 }
}
用法:

Something some = SomethingFactory.createSomething(3);

但通过搜索“java Deisgn Patterns Factory”或FactoryPattern可以阅读更多内容,您可以在构造函数中设置这些内容并公开公共最终字段:

public class ExampleClass
{
    public final Something something;

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

您可以在构造函数中设置这些内容并公开公共最终字段:

public class ExampleClass
{
    public final Something something;

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

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

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

这将返回对象浅拷贝,如果要使深度克隆覆盖clone()方法,希望这会有所帮助

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

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


这将返回对象浅拷贝,如果要使深度克隆覆盖clone()方法,希望这会有所帮助

你说优化是什么意思?即使在dalvik上(在dalvik的最新版本上),这样的调用也会被JITted。你是说get()调用已经优化了吗?是的。而且它肯定可以通过热点进行优化。@AlexWien我们在谈论优化吗?;-)JIT不会优化任何调用,但会优化频繁调用。顺便说一句,你能提供一个参考,直接访问java.awt.Point就是这样设计的,以消除函数调用开销吗?@AlexWien对
java.awt.Point
坐标的公共访问通常是由java的作者进行的,现在无法更正。你说优化是什么意思?即使在dalvik上(在dalvik的最新版本上),这样的调用也会被JITted。你是说get()调用已经优化了吗?是的。而且它肯定可以通过热点进行优化。@AlexWien我们在谈论优化吗?;-)JIT不会优化任何调用,但会优化频繁调用。顺便说一句,你能提供一个参考,直接访问java.awt.Point就是这样设计的,以消除函数调用开销吗?@AlexWien对
java.awt.Point
坐标的公共访问通常是由java的作者进行的,现在无法更正。但我想要的是优化的访问。克隆不是优化的,而且毫无意义,因为我想要的不是get()调用,而是直接使用varn,然后使用final方法并使某些内容受保护或公开,但是final方法不能设置多次varfinal,是的,一次,您希望它是只读的!否则,您可以使用工厂模式,这样只有工厂才能构建一些东西。factro在这个包中受到保护。这就是问题,如果我直接访问某个东西,var将是可写的(这是我不想要的)。但是我想要的是优化的访问。克隆不是优化的,而且毫无意义,因为我想要的不是get()调用,而是直接使用varn,然后使用final方法并使某些内容受保护或公开,但是final方法不能设置多次varfinal,是的,一次,您希望它是只读的!否则,您可以使用工厂模式,这样只有工厂才能构建一些东西。factro在该包中受到保护。这就是问题所在,如果我直接访问某个东西,var将是可写的(这是我不想要的)。但我想要的是重用该var,而不是创建更多的对象。对不起,我想我解释得不好,我想要的是只用于外部类调用的readonly。@A.Quiroga,我不知道在没有某种getter/setter的情况下有什么优雅的方式来执行这些事情。但我想要的是重用该变量,而不是创建更多的对象。对不起,我想我解释得不好,我想要的是readonly,用于外部类调用。@A.Quiroga,我不知道有哪种优雅的方式可以在没有某种getter/setter的情况下完成这些事情。