如何在Java中声明一个不能改变类成员的方法?

5 java oop

在 C++ 中我们做了一个常量方法,所以它不能改变类成员的值,但是我怎么能在 Java 中做到呢?我尝试了 final 方法声明,它等同于 C++ 中的 consts,但 final 方法是另一回事。我想做一个getter方法,所以它不能改变值,只能读取它。就像一个只读方法。

Ale*_*rov 9

在 Java 中,不可能以声明方式阻止方法更改非 final 字段。Java 中没有“常量正确性”这样的东西。

如果类字段是 non- final,则可以通过类的任何方法更改它。

请注意,final字段和变量与方法和类的工作方式不同:

  • final字段或变量是一个常数。它的值一旦分配就不能更改。
  • 一个final方法不能被子类覆盖。finalon 方法与“constness”无关。
  • 一个final类不能扩展。final在课堂上与“恒定性”无关。

您在 Java 中的选项是:

  1. 使您的类不可变(即标记其所有字段final)。
  2. 只需仔细编写你的 getter(和其他非变异方法):)

再一记。即使在字段和变量上,Java 的也final不同于 C++ 的const. 例如:

  • final变量一旦赋值就不能改变,你可以在声明之后赋值。例子:

      final int value;
      if (condition) {
          value = 1; // Ok!
      } else {
          value = 2; // Ok!
      }
      value = 3; // Compile error: value already assigned.
    
    Run Code Online (Sandbox Code Playgroud)
  • final必须分配类字段 - 直接分配或从构造函数内分配。但是这些字段可以在构造函数中的任何地方分配。Java 中没有像 C++ 的“初始化列表”这样的特殊东西。

  • final Object objJava 中的字段/变量/参数声明大致相当于C++ 中对非常量对象(const-) 引用。这意味着,您不能重新分配 reference,但您可以更改引用的对象本身。一个例子:

      // Note that (obsolete) Date class is mutable in Java.
      final Date myDate = new Date();
    
      myDate = new Date(); // Compilation error: can't reassign a final reference!
    
      myDate.setTime(4711); // Ok, mutating referenced object is allowed!
    
    Run Code Online (Sandbox Code Playgroud)