メソッドの計算がメソッドの外部でパラメータに渡されない状態(たとえばクラスフィールドなど)に依存する場合、メソッドの再利用性は低くなりますが、これは、それが存在するオブジェクト/クラスの状態(または悪い場合は、完全に別のクラス)に密接に結びついているからです。
を編集してください。[OK]をクリックすると、これが明確になります。私は質問のためだけにThreadLocal
を使用しましたが、一般的にグローバル変数に適用されます。最初のN個の整数の和を複数のスレッドで並列に計算したいとします。それを行う最善の方法は、各スレッドのローカル合計を計算することで、最後にそれらを合計することです。コードが正常に動作し、私たちの期待値を与える
class Foo {
public static ThreadLocal<Long> localSum = new ThreadLocal<Long>() {
public Long initialValue() {
return new Long(0);
}
};
}
class Task implements Callable<Long> {
private int start = 0;
private int end = 0;
public Task(int start, int end) {
this.start = start;
this.end = end;
}
public Long call() {
for(int i = start; i < end; i++) {
Foo.localSum.set(Foo.localSum.get() + i);
}
return Foo.localSum.get();
}
}
:何らかの理由で、私たちは、各Task
のcall
方法は、グローバル(静的)変数として別のクラスで定義されているThreadLocal sum
変数を使用することを決定しますグローバルな合計ですが、Task
クラスとそのcall
メソッドは、現在Foo
クラスに厳密に結合されています。別のプロジェクトでTask
クラスを再利用する場合は、Foo
クラスも移動する必要があります。そうしないと、コードはコンパイルされません。
これは単純な例ですが、「隠された」グローバル変数の危険性を確認することができます。また、コードを読み取っている誰かがクラスFoo
を検索し、Foo.localSum
の定義が何であるかを見なければならないので、読みやすさにも影響します。クラスはできるだけ自己完結型にする必要があります。
簡単なコード例で私の答えを編集しました。 – Tudor