我们在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;