【问题标题】:How to declare a method that cannot change the class members in Java? [duplicate]如何声明一个不能更改 Java 中类成员的方法? [复制]
【发布时间】:2020-11-30 10:13:34
【问题描述】:

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

【问题讨论】:

  • 这将相当于 C++ 中的 consts ...错误没有。不要假设其他语言中的关键字是什么意思。阅读语言规范或一本告诉您关键字含义的好书。其他任何事情都是浪费时间。
  • 我认为这个问题可以理解并且很好。假朋友问题 (en.wikipedia.org/wiki/False_friend) 始终是我们容易掉入的陷阱。如果 C++ 和 Java 中的不变性之间的差异不存在,那么关于 C++ 和 Java 中不变性之间差异的规范问答可能会很有用(?)

标签: java oop


【解决方案1】:

在 Java 中,不可能以声明方式阻止方法更改非最终字段。 Java 中没有“const 正确性”之类的东西。

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

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

  • final 字段或变量是常量。其值一旦分配就无法更改。
  • final 方法不能被子类覆盖。 final on methods 与“constness”无关。
  • 无法扩展final 类。 final on classes 与“constness”无关。

您在 Java 中的选择是:

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

还有一个注意事项。即使在字段和变量上,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++ 的“初始化器列表”这样的特殊东西。

  • Java 中的字段/变量/参数声明 final Object obj 大致相当于 C++ 中对非 const 对象的(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!
    

【讨论】:

  • 拜托,你能提供参考吗?
  • @Pat.ANDRIA 这几乎就像要求“提供一个上帝确实存在的参考。” :) 引用某事不可能可能并不容易。
  • @Pat.ANDRIA 这是一个关于final Java 的简短教程:javatpoint.com/final-keyword
  • @HonzaZidek,你说服了我 :) 添加了那部分。
【解决方案2】:

你不能那样做。 final 方法意味着它不能被覆盖。

【讨论】:

    猜你喜欢
    • 2019-04-09
    • 2021-11-25
    • 2010-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-20
    • 1970-01-01
    相关资源
    最近更新 更多