web-dev-qa-db-ja.com

javaでget / setメソッドを使用する場合

クラスでgetメソッドとsetメソッド(getName、setName)をいつ使用し、いつа = classVariable.getName()の代わりにclassVariable.name = ""を使用するかを知りたい

Setメソッドとgetメソッドを使用したクラスの例を次に示します

public class ClassExampe {

    String name;
    String course;

    public String getName ( )
    {
        return name;
    }

    public void setName (String studentName)
    {
        name = studentName;           
    }

    public String getCourse ( )
    {
        return course;
    }

    public void setCourse (String studentCourse)
    {
        course = studentCourse;
    }
}

ありがとう

24
Jovan

ゲッター/セッターの使用とフィールドの使用

経験則として:

同じクラスから直接変数を使用します(実際には同じ.Javaファイルからなので、内部クラスでも構いません)、他のクラスのゲッター/セッターを使用します。

37

単純なルールは次のとおりです。直接アクセスを使用しない(もちろん、クラス内から参照する場合を除く)。

  • フィールドアクセスはプロキシできません
  • イベント通知が必要な場合があります
  • 競合状態を防ぐことができます
  • 式言語はセッターとゲッターをサポートします
  • 理論的には、これはカプセル化を破壊します。 (もし私たちが慢であれば、すべてのフィールドのセッターとゲッターもカプセル化を破ります)
  • you mayセッターまたはゲッター内で追加のロジックを実行したいが、消費者がこれを慣例に従うことを期待するため、つまり、単純なゲッター/セッターであることはめったに推奨されない。
  • セッターのみまたはゲッターのみを指定して、読み取り専用または書き込み専用アクセスを実現できます。

これらのいずれかが必要であっても、これが発生しなくても、可能性は低いです。また、フィールドアクセスから始めると、変更が難しくなります。

23
Bozho

Javaでは、ゲッターとセッターを使用することが通常、ベストプラクティスと見なされます。

これは、プロパティがアクセスまたは変更されたときに何か他のことをするためにコードを変更する必要がある場合、既存のgetterまたはsetterで変更できるためです。

単純なオブジェクトでは少し混乱する傾向があると思う傾向がありますが、パブリックプロパティをゲッターとセッターにリファクタリングして機能を追加する必要がある場合は、苦痛になることがわかります。

10
Alan Geleynse

私は、ほとんどの場合、ゲッター/セッターを使用してプライベートメンバーにアクセスすると言うでしょう。必須ではありませんが、「ベストプラクティス」と見なされます。

利点の1つは、単純な割り当てと返却以上のことができることです。例:

public void setLevel(int lvl)
{
    if (lvl<0)
    {
        this.level=1;
    }
    else
        this.level = lvl;
}

public int getLevel()
{
    if (this.someIndicator==4)
        return this.level*7.1;
    else
        return level;
}

ゲッターとセッターを使用すると、後で実装を変更できます(たとえば、より複雑なことを行います)。検証ルールを実装できます(たとえば、名前が5文字以下の場合、setNameは例外をスローします)。

また、変数が「読み取り専用」のようになるように、setterではなくgetterを追加することもできます。

これが理論ですが、多くの場合(セッターを使用するHibernateなど)、セッターで例外をスローすることはできないため、検証を行うことはできません。通常、値は単に割り当て/返されます。私が働いたいくつかの会社では、すべての属性のゲッターとセッターを書くことが必須でした。

その場合、オブジェクトの外部から属性にアクセスし、読み取り/書き込み可能にする場合は、パブリック属性を使用します。これはコードが少ないため、obj.setVar(obj.getVar() + 5)より読みやすいobj.var += 5のようなものを書くことができます。

3
Adrian Smith

つまり、内部のプライベート変数をパブリックにする代わりにパブリックアクセサメソッドを使用する場合、深刻なパフォーマンス上の理由がない限り、私の答えは「常に」です。

つまり、独自のgetメソッドとsetメソッドを呼び出すか、クラス内の変数に直接アクセスするか、独自のアクセスメソッドを呼び出すと言います。このように、get/set getの一部として実装する変換、編集、またはルールは、独自の内部呼び出しと外部呼び出しによって自動的に呼び出されます。

Pure OO言語(Smalltalkなど)では、publicの概念はありません。すべての内部変数はprivateなので、アクセサーを使用する必要があります。lesspure OO =言語、物事を公開することができます-ただし、データ構造と実装の内部を公開することは、長期的に安定性とメンテナンスのために非常に悪い考えです。これについては、「密結合」を参照してください。

簡単に言えば、内部変数を公開すると、人々はそれらに直接アクセスでき、名前を変更したり、改行をすべて入力したりできます。これは副作用と呼ばれます。

2
Joe

一般に、セッターとゲッターを使用して、内部データにアクセスして変更するときに、コードを修正または拡張して処理および制御のレイヤーを追加することにより、開発者にコードを再利用する機会を提供します。これはJavaで直接アクセスを使用する場合は不可能です。

括弧:ただし、プロパティとメソッドの間の境界線が非常に細かくなることがあるScalaなど、他の言語では完全に可能です。そして、それが入るコーディングの問題にならないので素晴らしいことです。方法およびそれは使用法をより透明にします。


また、クラスでは、自分が何をしているのかを知っているはずなので、内部(プライベートまたは保護された)メンバーに直接気軽にアクセスできることを考慮することができます。別のメソッド呼び出し。

実際には、クラスで作業している複数の人は全員が何をしているかを知らない可能性があり、ゲッターとセッターでの整合性チェックの行はほとんどの場合有用ですが、マイクロ最適化はそうではありません。


さらに、変数に直接アクセスする方法は1つしかありませんが、必要な数のアクセサーを定義できます。

1
haylem

それは好みの問題ですが、一般的に言えば、公開されているすべてのプロパティに対して常にget/setメソッドを使用する必要があります。しかし、しばらくの間は気にされないだろうValue Object(VO)のようなものについては、あまり批判を受けずにパブリック変数を使用できると思います。

1
Piotr

クラスのプライベートフィールドをカプセル化し、希望する方法でgetter/setterクラスで公開します。

0
dimitrisli