47

これはかなり単純なトピックであることはわかっていますが、本当に頭を悩ませたいと思っています。

これは私がやろうとしていることですが、最終的な修飾子が好きではありません。私が探している効果を達成する別の方法はありますか? これは基本的に、アクティビティ全体でIDが変更されないようにしたいということです。

private final long mId;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    mId = getIntent().getLongExtra(ID_KEY, -1);
}

これは Android コードであることを指摘しておく必要があります。すべての助けをありがとう。ゲッターやセッター、または誰かが私のコードを変更することを心配していません。私が尋ねた理由は、次の開発者が引き継ぐために私のコードを将来証明することでした. この投稿は、いくつかの光を当てるのにも役立ちます。Android - アクティビティ コンストラクターと onCreate

4

7 に答える 7

62

final変数は、コンストラクターまたは初期化子でのみ設定できます。通常のメソッドは、宣言された変数の値を変更できませんfinal

于 2012-07-20T16:39:37.123 に答える
22

できません。ただし、それがプライベートであり、セッターがない場合は、外部オブジェクトがそれを変更しないことを保証できます。


または、 long 値を別のクラスでラップすることもできます - LazyImmutableLong. しかし、これはより冗長なアプローチであり、おそらく必要ないでしょう (注: 以下のクラスはスレッドセーフではありません)。

class LazyImmutableLong {

    private Long value;

    public void setValue(long value) {
         if (this.value != null) {
             return; // the value has already been set
         }
         this.value = value;
    }
    public long getValue() {return value;}
}

そしてあなたの活動の中で

private LazyImmutableLong id = new LazyImmutableLong();

public void onCreate(..) {
    id.setValue(..);
}
于 2012-07-20T16:37:47.070 に答える
0

コンストラクターでのみグローバル最終変数を後で設定できます。例:

public class ClassA {
   private final long mID;

   public ClassA(final long mID) {
      this.mID = mID;
   }
}

この場合、各コンストラクターで最終変数を初期化する必要があります。

于 2012-07-20T16:40:30.373 に答える
0

コンストラクターを作成したらすぐに初期化する必要があります。または、コンストラクターで最大で初期化することもできます。遅くとも..

于 2012-07-20T16:41:53.280 に答える
0
private final long mId;

finalJava 仕様に従って、実行時に参照を変更することはできません。そのため、一度 final として宣言すると、mId はその有効期間を通じて他の何かを指すことはできません (リフレクションを使用しない限り (または) オブジェクトで値をラップし、他の参照を介して変更しない限り)。

于 2012-07-20T16:37:28.550 に答える
-1

いいえ、できません

ある場所で final を宣言し、後で初期化できる場合、 final の意味は何ですか。

定数 ID が必要な場合は、Shared Preferences を使用して SP に保存し、必要なときにいつでも取得してみませんか。

于 2012-07-20T16:39:06.703 に答える