2

私は最近 Java で働き始め、すべてのゲッターとセッターのワイルドでクレイジーな世界を紹介されました。最初は嫌でしたが、すぐに慣れました。慣れすぎ。

私は最近、クラスの設計について考えることに多くの時間を費やしています。私がやろうとしていることの 1 つは、すべてに対してゲッターとセッターを実行するという罠を回避することです。ただし、私が行う作業の多くは、主にデータ コンテナーであるエンティティを使用するものであり、これらの場合にゲッターとセッターが実際に不適切であるかどうかはわかりません。

パブリック プロパティを使用した簡単な例を次に示します。

class Space {
    public String name;
    public String description;
    Space(final String name, final String description) {
        this.name = name;
        this.description = description;
    }
}

プライベート プロパティを使用し、ゲッターとセッターを使用する簡単な例を次に示します。

class Space {
    private String name;
    private String description;
    Space(final String name, final String description) {
        this.name = name;
        this.description = description;
    }
    public String getName() {
        return this.name;
    }
    public void setName(final String name) {
        this.name = name;
    }
    public String getDescription() {
        return this.description;
    }
    public void setDescription(final String description) {
        this.description = description;
    }
}

これらの例では、namedescriptionフィールドの両方を変更できる必要があります。

nameゲッター/セッターの例はより明確で、実装の詳細を隠しているように感じdescriptionます。必要に応じて、後でセットで検証することもできます。

ゲッターとセッターが悪であり、アンチパターンであるという議論をいくつか読みましたが、この状況には当てはまらないように感じます。

まだ検討していないオプションがいくつかあるかもしれません。提案をお待ちしています!

4

4 に答える 4

6

最初のバージョン(パブリックプロパティ)はお勧めできません。2番目の方が良いです。Josh Blochが言うように、「不変性を優先する」

public class Space {
    private final String name;
    private final String description;

    public Space(final String name, final String description) {
        this.name = name;
        this.description = description;
    }

    public String getName() {
        return name;
    }

    public String getDescription() {
        return description;
    }
}

そうは言っても、ゲッターとセッターは使いすぎになる傾向があります

于 2009-01-02T08:32:35.113 に答える
4

単純化しすぎていることが多い「get/setter は悪」という言葉を聞いたことがあるでしょう。データオブジェクトに問題があることを本当に意味する人は誰もいません (私が願っています) 。本当のアイデアは次のとおりだと思います。

「ゲッター/セッターは、単純なデータストレージオブジェクトを除いて悪です」それ自体は、「聞いてはいけません」の単なる伝道です。

理想的には、クラスにゲッターとセッターがある場合、それだけで十分です

とにかくそれが議論です。私はそれに同意するかどうかわかりません。

于 2009-01-02T09:06:23.580 に答える
3

簡単に言うと:

  • 外部から読み取る必要があるすべてのフィールドにゲッターが必要です。
  • 外部から書き込む必要のあるすべてのフィールドにセッターが必要です。

これは100%になる可能性がありますが、ほとんどの場合、それより少なくなります。

于 2009-01-02T08:31:49.467 に答える
0

アクセサーパターンはクラスの実装の詳細を隠すのに役立ちますが (たとえば、ハッシュテーブルを使用して属性を格納し、まばらに使用されるクラスのメモリを節約します)、実装が非常に冗長になる可能性があります (例ではアクセサーで 12 行以上あります)。そのため、C# には、既定のアクセサーを簡潔に指定できる特別なプロパティ構文があります。

class Space {
    public String Name { get; set; }
    public String Description { get; set; }
    Space(final String name, final String description) {
        this.Name = name;
        this.Description = description;
    }
}

別の形式では、アクセス指定子やコードを追加できます。

private String _name;
public String Name {
    get { if (_name == null) FetchName(); return _name; }
    private set { _name = value; }
}
于 2009-01-02T09:29:38.650 に答える