-1

クラスをfinalとして宣言するタイミングに疑問があります。それについてグーグルで調べていると、SO POST [1]の助けを借りて文字列不変と同じセキュリティ上の理由で完全に役立つことがわかりました。

私が知っているように、最終変数は一度初期化します。ちょうど例:

最終的な整数 i=10;

i=11; //コンパイル時エラーを与える

なぜならThe final local variable i cannot be assigned. It must be blank and not using a compound assignment

しかし、最終的なクラス変数を複数回作成したとき。それは私がそれをすることを可能にしています。最終クラスの複数のインスタンスを作成できる場合、どうすればそれが最終であると言えますか?

ビジネスロジックのニーズを満たす最終クラスの例を挙げていただけますか?

私が間違っていなければ、プリミティブの再初期化は許可されていませんが、オブジェクトは複数回作成できます。

4

3 に答える 3

3

クラスを final にすることは、人々がそれを拡張することを妨げるだけです。必要な数のインスタンスを引き続き作成できます。
これは、例えば String のように、クラスが不変であることを確認したい場合に便利です。String を拡張できる場合は、String を変更する動作を追加して、不変性を破ることができます。
クラス インスタンス変数の場合、規則はプリミティブの場合と同じです。それらが final として宣言されている場合、それらは再割り当てできません。ただし、インスタンスのメンバーを変更することはできます。

于 2013-06-01T18:08:38.227 に答える
1

final は、クラスを拡張できないことを意味します。クラスの複数のインスタンスを作成することもできます。例えば:

class ImmutableInt {
  int value;
  public ImmutableInt( int val ) {
    this.value = val;
  }
  public int getValue() {
    return value;
  }
  // no setter because I don't want people to change it!
}

上記の場合、ImmutableInt のインスタンスを多数作成できました。

ImmutableInt int1 = new ImmutableInt( 10 );
ImmutableInt int2 = new ImmutableInt( 100 );

これら 2 つのインスタンスは、常に 10 と 100 の値に設定されます。

ここで、誰かが ImmutableInt の値を変更できるようにしたいと判断したとします。そのため、extendImmutableInt とセッターを提供します。まあ、それはあるはずの何かにとって本当に意味がありませんimmutable

そこで、finalクラスに「誰もこのクラスを拡張して不変性の契約を破ることはできない」と付け加えます。また、フィールドに追加finalして、コンストラクターでのみ初期化でき、後で変更できないようにします。

final class ImmutableInt {
  final int value; // no default value here means it must be set in the constructor

  public ImmutableInt( int val ) {
    this.value = val;
  }

  public int getValue() {
    return value;
  }
  // no setter because I don't want people to change it!
}
于 2013-06-01T18:14:01.900 に答える
0

final は異なる場所で使用すると異なる意味を持つため、ここで説明する概念を混同しないでください。

最終クラス

最終クラスはサブクラス化できません。これは、セキュリティと効率の理由から行われます。したがって、java.lang.System や java.lang.String など、多くの Java 標準ライブラリ クラスは final です。

最終変数

final 変数は、初期化子または割り当てステートメントを介して一度だけ初期化できます。宣言の時点で初期化する必要はありません。これは「空白の最終」変数と呼ばれます。クラスの空の final インスタンス変数は、それが宣言されているクラスのすべてのコンストラクターの最後に確実に割り当てる必要があります。同様に、空白の final 静的変数は、それが宣言されているクラスの静的初期化子で確実に割り当てる必要があります。そうしないと、どちらの場合もコンパイル時エラーが発生します。

于 2013-06-01T18:17:14.893 に答える