Javaのコンテキストで次の行の意味を教えてください。
最終変数は、不変でない限り操作できます
私の知る限り、変数を final として宣言すると、再度変更することはできません。では、上記の行のimmutableという言葉は何を意味するのでしょうか?
Java オブジェクトへの最終参照がある場合でも、それを操作することはできますが、その参照を変更することはできません。たとえば、次のコードは完全に合法です。
import javax.swing.JLabel;
class Test1 {
private final static JLabel l = new JLabel("Old text");
public static void main(String[] args) {
System.err.println(l.getText());
l.setText("New Text");
System.err.println(l.getText());
}
}
しかし、あなたは言うことができません:
l = new JLabel("Newest Text");
l への最初の割り当ての後。ただし、これを行うことができることに注意してください。
import javax.swing.JLabel;
class Test1 {
public static void main(String[] args) {
final JLabel l;
String s = getArbitaryString(); // Assume this method returns a string
l = new JLabel(s);
System.err.println(l.getText());
}
}
これができるのは、l が宣言されたときに null 以外には割り当てられないためです。そのため、一度だけ何かを割り当てることができます。
プリミティブについても同じことが言えます。次のように値を割り当てることができます。
class Test1 {
public static void main(String[] args) {
final int i;
i = 2;
}
}
しかし、プリミティブ型にできることは値を代入することだけなので、これ以上操作することはできません。
最終変数が参照するオブジェクトまたは値を変更することはできません。最終変数を割り当てることができるのは1回だけです。
これは、オブジェクトの状態を変更できるかどうかには影響しません。オブジェクト自体は、この操作が禁止されるようにコーディングされていない限り、引き続き操作できます。不変オブジェクトとは、状態を変更できないオブジェクトです。
いつも私を殺す人?
final 変数を実際に思ったほど安全にしたい場合は、String[] のコピーを返すために多くの余分なコードが必要です。
たとえば StringBuffer 型の可変最終変数を操作できますが、不変型の最終変数は操作できません。
可変変数の場合、値が変更されるたびに新しいオブジェクトが作成されるわけではありません。ただし、不変型の場合、値を変更するたびに新しいオブジェクトが作成されるため、final にすると変更できません。
メソッドが参照が指しているオブジェクトの状態を変更できる場合でも、任意のメソッドを呼び出すことができます。例えば
final MyClass myClass = new MyClass();
myClass.setVar(something);
それ自体は変更されていないため、これは問題ありません。myClass
つまり、実行していませんmyClass = myClass1;
。
はい、最終変数は変更できます。
final StringBuffer s = new StringBuffer();
// won't work
s = new StringBuffer();
//this works
s.append("hai");
参照は変更できませんが、オブジェクトのフィールドは変更できます。詳細については
リフレクションを使用して「最終」変数を変更することもできます。