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.
-
1*which would be the equivalent to the consts in C++* ... err no. Don't **assume** what keywords in other languages mean. Read the language spec or a good book that TELLS you what keywords mean. Anything else is a waste of time. – GhostCat Nov 30 '20 at 10:28
-
I think the question is undertandable and good. The False Friend problem (https://en.wikipedia.org/wiki/False_friend) is always a trap we easily fall into. Maybe a canonical Q&A about the difference between immutability in C++ and Java would be usefeful, if it already does not exist(?) – Honza Zidek Nov 30 '20 at 10:34
2 Answers
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!

- 26,085
- 12
- 82
- 103
-
-
1@Pat.ANDRIA It is almost like requiring "Put a reference that God does *not* exist." :) It is not easy to put a reference that something is *not* possible. – Honza Zidek Nov 30 '20 at 10:20
-
1@Pat.ANDRIA here's a short and simple tutorial on `final` in Java: https://www.javatpoint.com/final-keyword – Alex Shesterov Nov 30 '20 at 10:22
-
1