0

2 つのクラス関連の変数を使用し、取得/作成にコストがかかるメソッドを持つクラスFooを取得しました。私の最初のバージョンは次のようになります。doSomethingbc

public class Foo {

    private final A a;

    public Foo(A a) {
        this.a = a;
    }

    public void doSomething() {
        final B b = a.getB();
        final C c = b.getC();

        for (int i = 0; i < 1000; i++) {
            // do something with b and c
        }
    }
}

したがってB、クラス変数aを介して最初のオブジェクト ( type ) を取得し、最初のオブジェクトを介して 2 番目のオブジェクト ( type C) を取得します。

さて、これらの変数はクラスに関連しており、メソッドは常に1 回だけ呼び出されるため (必ずしも type のオブジェクトを作成するときではありませんFoo)、それらをクラス変数にすることも考えました。

public class Foo {

    private final A a;
    private final B b;
    private final C c;

    public Foo(A a) {
        this.a = a;
        b = a.getB();
        c = b.getC();
    }

    public void doSomething() {
        for (int i = 0; i < 1000; i++) {
            // do something with b and c
        }
    }
}

これら2つのいずれかの場合、どのバージョンを使用するかわかりません。これらの 2 つの変数は、既存のクラス variable から取得できるため、クラス メンバーを作成するのはどうも気が進まないのですa。ただし、メソッド IMO の可読性が向上します。

4

4 に答える 4

3

あなたは、絶対に正しい。読みやすさが向上する場合は、必ず実行してください。しかし、私はあなたにこう尋ねます: クラス内から A を参照する目的は何ですか? BとCを取得するためだけですか?この場合、Foo のコンストラクターに B と C を入力するだけです。

このようにして、Aへの依存関係を壊し、 B と C への依存関係をより明確にすることで、より読みやすくします。

また、クラス内の他のメソッドでこれらの変数を使用しているかどうかも検討してください。答えが「はい」の場合は、それらがクラス メンバーである必要があることを示しています。ただし、クラスにこれらの変数を使用しないメソッドが多数含まれている場合は、逆の信号になる可能性があります。

ここで従うべき一般原則は、高結束の原則です。

于 2012-07-25T19:41:48.160 に答える
2

一般的に言えば、ローカル変数を使用できる場合は、フィールドを使用するよりも望ましいです。

ローカル変数の使用

  • 変数を使用する場所に限定します。
  • より少ないメモリを使用します。
  • スレッドセーフです。
于 2012-07-25T19:39:45.440 に答える
0

私の経験から、静的(またはクラス変数|フィールド|メソッド)は通常、しばらくすると悪になり、その性質上静的である場合を除いて、リファクタリングする必要があります(Math.PIまたはMath.max()は例またはそのような静的ですもの)。これらのメソッドが動的なものに基づいて計算を行っている場合は、インスタンスとして残します。

于 2012-07-25T19:46:15.643 に答える
0

クラスFooにBとCのインスタンスを保存しないのはなぜですか?クラスのどこかでAを参照していますか?それ以外の場合、BとCの両方をインスタンス変数として格納すると、1つのAオブジェクトにBとCのオブジェクトが含まれるため、メモリ効率が低下します。

于 2012-07-25T19:44:27.630 に答える