我们在java中是否有一个Readonly字段(在类本身的范围内是可设置的)?

2022-09-01 00:31:09

我们怎么能有一个在类内可写但只在类外“可读”的变量呢?

例如,不必这样做:

Class C {
  private int width, height;

  int GetWidth(){
    return width;
  }

  int GetHeight(){
    return height;
  }

  // etc..

我想做这样的事情:

Class C {
  public_readonly int width, height;

  // etc...

最好的解决方案是什么?


答案 1

创建包含字段的类。提供将初始化这些字段的构造函数。这样,您的类将是不可变的,但从外部访问值时不会有开销。例如: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);
    }
}

答案 2

在Java中没有办法做到这一点。

您的两个选项(您提到的一个)是使用公共 getter 并将字段设为私有,或者在课堂上提供完整的文档。

getter 方法的开销非常小(如果有的话)。如果执行大量操作,则可能需要缓存提取的值,而不是调用 get 方法。

编辑:

一种方法(尽管它比 getter 开销更大)是使用仅对类可用的构造函数定义一个公共内部类(我们称之为 ),并使字段公开。这样,您就无法在类外部创建实例,因此无法从外部更改字段,但您可以从内部更改字段。但是,您可以从外部阅读它们。innerCCinnerC


推荐