私は、メソッドシグネチャでfinalキーワードを使用すると、java.lang.Number(例:java.lang 。長いです)?メソッドにjava.lang.Numberのインスタンスを渡すときの最終的なキーワード
Javaパスオブジェクトが価値観に敬意を表しているので意味がないと思います。つまり、javaは元の参照のコピーをメソッドに渡します。この番号の値の変更は、メソッド外では見えません。したがって、メソッドがメソッド内の値を変更するかどうかは関係ありません。
もちろん、pojoをメソッドに渡すと、最終的なキーワードを使用するのは意味がありますが、別のシナリオです。
java.lang.Number型のデモ
public class Demo {
public static void main(String[] args) {
Long longValue = 1L;
System.out.println("Long before: " + longValue);
System.out.println(trickyMethod(longValue));
System.out.println("Long after: " + longValue);
BigInteger bigIntegerValue = BigInteger.ONE;
System.out.println("BigInteger before: "+ bigIntegerValue);
System.out.println(trickyMethod(bigIntegerValue));
System.out.println("BigInteger after: " + bigIntegerValue);
}
private static String trickyMethod(Long value) {
value = 10L;
System.out.println(" trickyMethod: " + value);
if (value.equals(10L))
return " equal";
else
return " different";
}
private static String trickyMethod(BigInteger value) {
value = BigInteger.TEN;
System.out.println(" trickyMethod: " + value);
if (value.equals(BigInteger.TEN))
return " equal";
else
return " different";
}
}
と出力
Long before: 1
trickyMethod: 10
equal
Long after: 1
BigInteger before: 1
trickyMethod: 10
equal
BigInteger after: 1
POJOのデモ
public class Demo {
static class Container {
private Long l;
public Container(Long l) {
this.l = l;
}
@Override
public String toString() {
return String.valueOf(l);
}
@Override
public boolean equals(Object obj) {
Container c = (Container) obj;
return l.equals(c.l);
}
}
public static void main(String[] args) {
Container container = new Container(1L);
System.out.println("Container before: "+ container);
System.out.println(trickyMethod(container));
System.out.println("Container after: " + container);
}
private static String trickyMethod(final Container container) {
container.l = 10L;
System.out.println(" trickyMethod: " + container);
if (container.equals(new Container(10L)))
return " equal";
else
return " different";
}
}
と出力
Container before: 1
trickyMethod: 10
equal
Container after: 10
開発者がLong
の場合には、このString method(final Long value)
のようなメソッドのシグネチャでは、最終的なキーワードを使用するのはなぜ?
変数とパラメータの再利用(意味が変更されている)は、非常に多くの場合、わかりやすく、見つけにくいバグです。 'final'キーワードは、パラメータに新しい値を与えようとするとコンパイラエラーを引き起こします。また、内部的な理由から、そのメソッドで作成された匿名クラス内でパラメータが使用されている場合、パラメータは 'final'でなければなりません。 'trickyMethod'の –
は、最終フィールドではない' container.l'を再割り当てしています。 'container'自体を再割り当てすると、コンパイラエラー – Vanguard