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

标签 java oop

这个问题在这里已经有了答案:





What is the Java equivalent of C++'s const member function?

(9 个回答)


11 个月前关闭。




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

最佳答案

在 Java 中,不可能以声明方式阻止方法更改非 final 字段。 Java 中没有“常量正确性”这样的东西。
如果类字段不是 final ,那么它可以被类的任何方法改变。
请注意 final与方法和类相比,字段和变量的工作方式不同:

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

  • 您在 Java 中的选项是:
  • 使您的类不可变(即标记其所有字段 final )。
  • 只需仔细编写您的 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.
    
  • final必须分配类字段 - 直接分配或从构造函数中分配。但是这些字段可以在构造函数中的任何地方分配。 Java 中没有像 C++ 的“初始化列表”这样的特殊东西。
  • 字段/变量/参数声明 final Object obj在 Java 中大致相当于对 C++ 中非常量对象的 (const-) 引用。这意味着,您不能重新分配引用,但您可以更改引用的对象本身。一个例子:
      // 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!
    
  • 关于java - 如何在Java中声明一个不能改变类成员的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65071616/

    相关文章:

    java - 使用@Query 与通过 CrudRepository 的 findAll() 进行自定义查询哪个更快?

    PHP5 : Callbacks between Class Objects

    java - 潜在无用的对象

    c - 何时定义 GTK 类,何时使用信号?

    c++ - 为每个实例重新定义方法

    java - 删除位置管理器不起作用的更新

    java - 重新单击后取消选择 JCheckBox

    java 我如何检查文件名并使用 FileResource auxFr = new FileResource ("/testing/yob"+ auxYear + "short.csv"); 打开

    java - 可以将 jaxb 对象转换为 org.w3c.dom.Element 吗?

    python - 当我在 python 中使用 f 字符串时得到不同的输出