我们在java中有一个Readonly字段(可以在类本身的范围内设置)吗?
我们怎样才能拥有一个在类中可写但在其外只能“可读”的变量?
例如,而不是必须这样做:
Class C { private int width, height; int GetWidth(){ return width; } int GetHeight(){ return height; } // etc..
我想做这样的事情:
Class C { public_readonly int width, height; // etc...
什么是最好的解决方案?
在Java中没有办法做到这一点。
您提供的两个选项(您提到的一个选项)正在使用公共getter并将该字段设为私有,或者在类中提供全面的文档。
getter方法的开销非常小(如果有的话)。 如果你这么做很多次,你可能想要缓存获取的值而不是调用get方法。
编辑:
一种方法,虽然它比getter有更多的开销,但是定义一个公共内部类(让我们称之为innerC
)使用只对你的C
类可用的构造函数,并使你的字段公开。 这样,您就无法在类外部创建innerC
实例,因此无法从外部更改字段,但您可以从内部更改它们。 但是你可以从外面读它们。
创建一个包含public final
字段的类。 提供构造函数,用于初始化这些字段。 这样,您的类将是不可变的,但您不会有从外部访问值的开销。 例如:
public class ShortCalendar { public final int year, month, day; public ShortCalendar(Calendar calendar) { if (null == calendar) throw new IllegalArgumentException(); year = calendar.get(Calendar.YEAR); month = calendar.get(Calendar.MONTH); day = calendar.get(Calendar.DATE); } }
据我所知,编译器没有优化这种代码
Hotspot JIT编译器绝对可以 。
我想知道什么是最好的解决方案?
停止过早优化。 如果你在绘画例程中使用这个代码,我可以保证实际绘画比调用一个简单的方法花费至少一百倍,即使它没有内联。
没有办法让一个字段从外面“只读”。 唯一的 – 也是正确的 – 是将字段设为私有,只提供getter,不提供setter。
实际上,HotSpot编译器很可能会内联对getter的调用,因此不会产生任何开销(此外,调用这些方法的开销几乎不可测量)。
编辑
如果您确实需要每个CPU周期,请使用C或C ++(或在其中编写性能关键部分并通过JNA调用它,尽管它不太可能花费时间)。
您的解决方案是:私有字段,私有setter,受保护或公共getter(注意:protected允许从同一个包以及子类访问)
是..我们可以使用final关键字将变量设为只读
例如: public final int id = 10;