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的情况下完成这些事情。