java - How to declare a method that cannot change the class members in Java?
问题描述
In C++ we do a constant method, and so it can't change the value of the class members, but how can I do it in Java? I tried the final method declaration, which would be the equivalent to the consts in C++, but final methods are another different thing. I want to make a getter method, so it cannot change the values, only read it. Like a read-only method.
解决方案
In Java, it's not possible to declaratively prevent a method from changing non-final fields. There's no such thing as "const correctness" in Java.
If a class field is non-final
, then it can be changed by any method of the class.
Note that final
works differently on fields and variables versus methods and classes:
- A
final
field or variable is a constant. Its value cannot be changed once assigned. - A
final
method cannot be overridden by child classes.final
on methods has nothing to do with "constness". - A
final
class cannot be extended.final
on classes has nothing to do with "constness".
Your options in Java are:
- Make your class immutable (i.e. mark all its fields
final
). - Just write your getters (and other non-mutator methods) carefully :)
One more note. Even on fields and variables, Java's final
differs from C++'s const
. For example:
final
variables can't be changed once assigned, but you can assign them after the declaration. Example:final int value; if (condition) { value = 1; // Ok! } else { value = 2; // Ok! } value = 3; // Compile error: value already assigned.
final
class fields must be assigned - either directly or from within a constructor. But these fields may be assigned anywhere within a constructor. There's no special thing like C++'s "initializer list" in Java.The field/variable/parameter declaration
final Object obj
in Java is roughly equivalent to a (const-)reference to a non-const object in C++. This means, you can't re-assign the reference, but you can change the referenced object itself. An example:// 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!
推荐阅读
- javascript - 通过 apache webproxy 连接到 socket.IO 服务器
- python - 如何根据选项读取不同的配置文件 - python & 命令行
- django - Django 内联没有 ForeignKey
- javascript - Enable autocomplete dropdown when clicked on the contenteditable area
- batch-file - 需要将我的 Runnable JAR 文件转换为批处理文件吗?
- java - 如果我有许多有订单的堆栈,我怎样才能最好地遍历它们以获得正确的位置?
- python - 在 Python 中使用 Pandas 在两个不同的数据帧之间建立索引和匹配行
- python - 在烧瓶中禁用对控制台的请求日志记录
- excel - 在 Excel VBA 中将超链接添加到另一个选项卡会出现错误 438
- sql - PostgreSQL:限制行中没有重复的单元格