0

2 つの異なるメソッド (静的メソッドと非静的メソッド) にインスタンス変数が必要であるとします。

変数は、比較目的でメソッド内で 3 ~ 5 回使用されます。

変数はいかなる方法でも変更されません。

また、変数のタイプ (文字列、コレクション、コレクションなど) によって、コーディング方法が異なります。

プライベートメソッド(静的および非静的)内でインスタンス変数を使用する最良/正しい方法は何ですか?

  1. メソッドの引数として渡す
  2. this.getClaimPropertyVertices(); メソッドを使用して値を取得し、ローカルに保存します。
  3. 値を取得してローカルに保存します - this.claimPropertyVertices;
  4. メソッド内でインスタンス変数を直接使用する

値を格納するローカル変数を作成する場合、変数が変更されない場合、「final」キーワードは何らかの利点を提供します。

編集 1: コメントに基づいて、追加情報を追加しています メソッドでローカルに値を作成することはできません。クラスまたはクラスによってアクセスされる他のメソッドから取得する必要があります。

回答に基づく私の解決策:
@EricJ の回答に基づいています。と@ジョドレル。オプション 1 を使用し、それをプライベートな静的メソッドとして作成しました。また、これをサポートするためにここでいくつかの詳細を見つけました。

4

2 に答える 2

4

値を格納するローカル変数を作成する場合、変数が変更されない場合、「final」キーワードは何らかの利点を提供します。

Java では、finalはコンパイラに最適化の機会を提供します。変数の内容は変更されないことを示しています。キーワードreadonlyは、C# で同様の役割を提供します。

最適化のための追加の機会が意味を持つかどうかは、特定の問題によって異なります。多くの場合、アルゴリズムの他の部分のコストは、 finalまたはreadonlyのためにコンパイラが実行できる最適化よりもはるかに大きくなります。

これらのキーワードを使用すると、別の利点があります。それらは値が変更されないという契約を作成します。これは、コードの将来の保守担当者が値を変更すべきではないことを理解するのに役立ちます (実際、コンパイラは変更を許可しません)。

プライベートメソッド(静的および非静的)内でインスタンス変数を使用する最良/正しい方法は何ですか?

メソッドの引数として渡す

値はすでにインスタンスに格納されています。なぜそれを渡すのですか?最良のケースは、これがインスタンス プロパティ/フィールドを使用するよりも優れているということではありません。最悪の場合、JITer は呼び出しをインライン化せず、数 CPU サイクルを消費するより大きなスタック フレームを作成します。注:静的メソッドを呼び出す場合、静的メソッドはオブジェクト インスタンスにアクセスできないため、変数を渡す必要があります。

this.getClaimPropertyVertices(); メソッドを使用して値を取得し、ローカルに保存します。

これは私が一般的にしていることです。ゲッター/セッターは、フィールドの周りに意味のあるラッパーを提供するためにあります。場合によっては、getter がバッキング フィールドを初期化します (オブジェクト コンストラクターを呼び出さないシリアライザーを使用する場合の C# での一般的なパターン。そのトピックを開始しないでください...)。

値を取得してローカルに保存します - this.claimPropertyVertices;

いいえ、上記を参照してください。

メソッド内でインスタンス変数を直接使用する

上記とまったく同じです。これを使用しても使用なくても、まったく同じコードが生成されます。

更新(編集に基づく)

値がオブジェクト インスタンスの外部にあり、意味のある意味でインスタンスと共に格納する必要がない場合は、値としてメソッド呼び出しに渡します。

于 2012-08-30T16:29:00.163 に答える
2

できる限り static キーワードを使用して関数を記述すると、明らかな利点がいくつかあります。

  1. どの入力が署名から関数に影響を与えるかは明らかです。

  2. 関数に副作用がないことはわかっています (参照渡しでない限り)。これにより、GUI の変更など、機能以外の副作用が見落とされます。

  3. 関数はプログラム的にクラスに関連付けられていません。論理的にその動作が別のエンティティとの関連性が高いと判断した場合は、関数を移動するだけです。次に、名前空間の参照を調整します。

これらの利点により、関数は理解しやすく、再利用しやすくなります。また、マルチスレッドのコンテキストで関数を簡単に使用できるようになります。副作用が広がることによる競合について心配する必要はありません。


私はこの答えを黙認します。static キーワードを使用して、潜在的に再利用可能な関数を記述する必要があります。実装されている場合は、単純な機能または明らかに結果が得られない機能は、プライベート メンバーまたはゲッターにアクセスする必要があります。

于 2012-08-30T16:46:46.513 に答える