Javaでクラスメンバーを変更できないメソッドを宣言するにはどうすればよいですか?[複製]

Nov 30 2020

C ++では定数メソッドを実行するため、クラスメンバーの値を変更することはできませんが、Javaでどのように変更できますか?C ++のconstsと同等のfinalメソッド宣言を試しましたが、finalメソッドは別のものです。ゲッターメソッドを作成したいので、値を変更できず、読み取るだけです。読み取り専用の方法のように。

回答

10 AlexShesterov Nov 30 2020 at 17:16

Javaでは、メソッドが非最終フィールドを変更することを宣言的に防ぐことはできません。Javaには「constcorrectness」のようなものはありません。

クラスフィールドが非の場合、クラスのfinal任意のメソッドで変更できます。

finalフィールドと変数とメソッドとクラスでは動作が異なることに注意してください。

  • finalフィールドまたは変数が一定です。一度割り当てた値は変更できません。
  • finalこの方法は、子クラスでオーバーライドすることはできません。finalメソッドについては、「恒常性」とは何の関係もありません。
  • finalクラスを拡張することはできません。finalクラスでの「恒常性」とは何の関係もありません。

Javaでのオプションは次のとおりです。

  1. クラスを不変にします(つまり、すべてのフィールドにマークを付けますfinal)。
  2. ゲッター(およびその他のミューテーター以外のメソッド)を注意深く書くだけです:)

もう1つ注意してください。フィールドや変数についても、JavafinalはC ++とは異なりconstます。例えば:

  • final割り当てられた後の変数を変更することはできません、しかし、あなたはそれらを割り当てることができた後宣言。例:

      final int value;
      if (condition) {
          value = 1; // Ok!
      } else {
          value = 2; // Ok!
      }
      value = 3; // Compile error: value already assigned.
    
  • finalクラスフィールドは、直接またはコンストラクター内から割り当てる必要があります。ただし、これらのフィールドはコンストラクター内のどこにでも割り当てることができます。JavaのC ++の「初期化リスト」のような特別なものはありません。

  • final Object objJavaのフィールド/変数/パラメーター宣言は、C ++の非constオブジェクトへの(const-)参照とほぼ同等です。つまり、参照を再割り当てすることはできませ、参照されるオブジェクト自体を変更することはできます。例:

      // 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!
    
salapura.stefan Nov 30 2020 at 17:17

それをしてはいけない。最終メソッドは、オーバーライドできないことを意味します。