2

いくつかの単純なジオメトリを表す Java クラスを作成しています。

最上位のabstractクラス (それ自体がpackage-private ) で、同じパッケージ内のサブクラスからアクセスする必要がある属性を宣言しました。

のように属性を宣言するfinalAbstractClass

final int foo;

getter メソッドに煩わされることなく、パッケージ内で直接アクセスできます。でも。「実践」(または私が一般的なスタイルであると信じているもの)に従って行うと、次のようになります。

private final int foo;

もちろん、これには非privateゲッターが必要です。サブクラスはfoo、外部オブジェクトであるかのように (非常に関連性の高い典型的な属性である) を参照する必要があります。

this.getFoo();

コードを追加し、これらのメンバーに直接アクセスする方法 (つまりfoo) を削除します。

privateとにかく最終的なものであり、これらの属性をパッケージ内で内部的に公開することを心配していないため、修飾子をスキップすることの欠点はありますか?

ゲッター/セッターは、オブジェクトが独自の属性にアクセスするための非常に自然な方法であると主張する OO 支持者を知っていますが、これはいつ、非化粧的で非 [JavaBeans スタイルのものを挿入] するのでしょうか?

内部クラス を考えてみましょう。これは、2 つの属性Coordinateがあるため非常に単純です。使用方法はすべて class に残します。intOuterClass

class OuterClass{
    final static class Coordinate{
        final int x, y;
        Coordinate(int x, int y){
            this.x = x;
            this.y = y;
        }
    }
    Coordinate coordinate;
}

この内部クラスの場合、getter を作成するという慣習を気にする必要があるのはなぜですか? ゲッターはより多くのコードを導入し、同じパッケージ内のすべてのクラスcoordinate.getX();を単純に呼び出す代わりに強制的に呼び出しますcoordinate.x;。ここにオーバーヘッドはありますか?finalclass の修飾子に注意してくださいCoordinate

4

3 に答える 3

6

ゲッターの利点は、実装からインターフェイスを切り離すことです。現在getFooは return しか実行しないかもしれませんがfoo、将来的には、たとえばfooメンバーをリモートにして、代わりに計算結果を返したいと思うかもしれません。getter を使用すると、各呼び出しサイトで変更を行うことなく、これを行うことができます。

于 2012-11-26T01:12:47.663 に答える
2

JSF ページからこの値にアクセスする場合は、foo だけでなく getFoo が必要になります ( object.foo.

それとは別に、今日、このフィールドは最終的なものであり、長い間変更される可能性があります(推測します)。可能性が0に限りなく近いとしても、グッドプラクティスに従うことにやり過ぎはないと私は信じています。ほとんどの場合、コードをゼロから作成するよりも変更を行っているため、可能な限り自分自身を保護する方がはるかに優れています (書くだけprivateで、Eclipse の場合は約 4 クリックでゲッターとセッターを自動的に生成できます)。

于 2012-11-26T01:49:22.967 に答える