2016-11-21 5 views
0

私は現在混乱しており、いつget-methodを呼び出すべきかわかりません。私がgetを使わずに変数を呼び出すとき、getを使って変数を呼び出すときの違いは何ですか?私は "これ"が何をしているのか知っていますが、メソッドの呼び出しと変数の呼び出しに違いがあるかどうかはわかりません。例えば :私はこのケースで変数自体getメソッドと呼ばれていない場合javaのthis.variableとthis.getVariable()の違いは何ですか?

public class Student() { 
    private int idNumber; 
    private String name; 
    Student (int idNumber, String name) { 
     this.idNumber = idNumber; 
     this.name = name; 
     } 
     public int getIdNumber() { 
     return idNumber; 
     } 
     public String getName() { 
     return name; 
     } 
     // method to add 2 idNumbers 
     public int addNumbers(int no) { 
     int result = this.idNumber + no; 
     int result = this.getIdNumber() + no; 
     } 

は違いはありますか? ありがとうございます。

+1

'this.variable'は現在のオブジェクトのフィールドを参照します。 'this.getVariable()'は関数呼び出しです。 – mallaudin

+1

@bradimus私はこれが重複しているとは思わない。参照される質問は、_外界のゲッタとセッタについて質問します。この質問は代わりに、同じクラスのゲッターを使用するかどうかを尋ねます。 – Seelenvirtuose

+0

質問は重複しています。言及された質問に「外の世界」にのみ適用されるべきであるという言及はない。両方の状況に同じルールが適用されます。 –

答えて

-1

クラスのメンバー変数はプライベートなので、クラス外では使用できません。外界では、getVariable()を使用する必要がありますが、クラス内ではメンバメソッドで変数を直接参照できます。

これは「encapsulation」として知られているものである、と私はgetメソッドと呼ばれていない場合には差が(ポリモーフィズムと継承と一緒に)オブジェクト指向プログラミング

+0

なぜdownvote?この回答に正しいものがありませんか? –

0

の基本的な部分の一つがありますされますこの場合、変数 自体はありますか?あなたが直接this.idNumberを使用してではなく、法this.getIdNumber()を使用して変数にアクセスする変数にアクセスする場合

違いはありません

、しかし、は、コードが読みやすくなります。コードが読みやすい(重要な)場合は、そのコードをよりよく理解して簡単に維持することができます。

0

this.variableは、変数自体への直接の参照です。 this.getVariable()は方法であり、その結果としてthis.variableが得られるかもしれませんが、何か他のことを行う可能性があります。それはただの変数です。

これにはいくつかの用途があります。私はゲッターになると防衛的にプログラムをするのが好きです。

たとえば、次のクラス構造があるとします。

public class School { 
    private final Set<Person> teachers = new HashSet<>(); 

    public boolean addTeacher(Person teacher) { 
     return teachers.add(teacher); 
    } 
} 

ここでは、学校の教師を返す機能が必要です。これを行うには魅力的かもしれません...

public Set<Person> getTeachers() { 
    return this.teachers; 
} 

...しかし、これは、いくつかの予期しない結果をもたらすことができます。たとえば、あるクラスのクライアントがこれを行う場合...

Set<Persons> persons = someSchool.getPersons(); 
persons.clear(); 

...突然内部の人物が空になりました。これはあなたのクラスのクライアントに公開する意図しない動作かもしれません(私はこれが起こったいくつかのIRLの専門的なケースを持っていました!)。答えは、ユーザーを与えないためには、あなたの内部、プライベートオブジェクトへのアクセスを、今

...

public Set<Person> getTeachers() { 
    return new HashSet<Person>(this.teachers); 
} 
をわずかに異なる方法で getTeachers()を実装することにより、getTeachers方法は、人のブランドの新しいセットを返します。 getTeachersの結果に対してユーザーが何をするにしても、プライベートコレクション( this.teachers)は、セットに対して作用することによって変更することはできません。これにより、Schoolクラスは内部状態をより詳細に制御することができ、getterが実際に取得している変数を返さない場合の良い例の1つです。

0

私は取得せずに私の変数を呼び出すと、私が手...

とそれを呼び出す場合は、クラス内の属性へのアクセスについて話している場合は一般的に、がある違いは何ですかほぼあなたはまだ同じ属性にアクセスしているので違いはありません。

しかし、私は後でその点に戻って微妙な違いがあります。

ここで、クラスの外部から属性にアクセスしている場合。 privateアクセス修飾子でマークされている場合、その属性にアクセスすることはできません。

例:

class Hero{ 
    private int health;  //inaccessible from anywhere outside the class 

    public int getHealth(){ 
     return health;  //allows access of health outside the class 
    } 
} 

healthはpublicとして宣言された場合、今想像し、あなただけの直接あなたは、このような何か他のものにhealthのデータ型を変更する必要があることを認識myHero.healthと1日を使用してアクセス健康を表現するクラスとして:

class Health{ 
    private int minHealth; 
    private int maxHealth; 
    private int healthValue; 
} 

しかし、あなたはまだ頻繁にあなたがアーカンソーことmyHero.healthでコーディングされていますあなたのコードを今変更するのに困っています。

myHero.getHealth()でコーディングしたとします。すべてのコードでゲッター(getHealth())を引き続き使用して健康価値を得ることができるため、今は違いがあります。あなたがやらなければならないことは、健康上の値を返すためにgetHealth()の実装を変更することです:health

class Hero{ 
    private Health health;  //Data type changed, no worries.. 

    public int getHealth(){ 
     return health.getHealthValue(); //Implementation can be changed here..   
    } 
} 

データ型は、(直接それに依存している他のモジュールの面で)あまり心配することなく変更することができます。 privateなので、依存関係はなく、副作用が多すぎることなく変更できます。


ここで、クラスそのものの属性へのアクセスについて説明します。個人的には、属性に直接アクセスするのではなく、ゲッターを呼び出すことはまだ安全だと思います。

次の例を使用する:

class Circle{ 
    private double radius; 
    private double area; 

    public double getArea(){ 
     return Math.PI * radius * radius; 
    } 
} 

これは良いデザインではなく、説明のために、私はそれをこのように書かれています。

したがって、Circleクラスでは、this.areathis.getArea()が同じことをするようです。しかし、特定の機会にゲッターそのものが、単にあなたに裸の変数を渡すだけではなく、仕事をしているかもしれません。 this.areaを書くと、半径に基づく領域の代わりに0.0を与える傾向があります。

もう一度、最良の例ではありませんが、あなたは私の得点を得ます。新しいクラスMyClassAについては

0

とそこフィールド、ベストプラクティスは次のとおりです。 - プライベートフィールドに を追加 - の値を設定し、各フィールドの公開ゲッターとセッターを追加し、この場合、フィールド

にしてから値を取得しますたとえば、MyClassAのインスタンスを含む新しいMyClassBをインスタンス化すると、myClassBオブジェクトはgetterおよびsetterのみを使用でき、MyClassAフィールドと直接対話できなくなります。

アドバンテージは、たとえば、myClassAに値を保存する前に値をチェックする可能性があります。あなたの例では

は、あなたがしたい場合idNumberは、このセッターを使用し、負にすることはできません。

public void setIdNumber(int newValue) { 
    if(newValue<0) { 
     this.idNumber=newValue*-1; 
    } else { 
     this.idNumber=newValue; 
    } 
} 

他の利点には、セッターとゲッターを使用して、あなたが読むべきフィールドをロックしたり、外部のオブジェクトから書くことができますです。ゲッターのコードを書くだけで、読み取りまたは設定が書き込みを許可できるようになります。

getter/setterでプライベートフィールドを使用する最後の重要なポイントは、unknowオブジェクトでダイナミックに読み書きするためにリフレクションを使用するすべてのライブラリがこれらのgetter/setterを使用することです。 reflexionを使用すると、任意のオブジェクト(プライベートまたはパブリック)のフィールドのリストを取得し、それに対する読み取り/書き込みを行うことができます。 "myField"というフィールドに "getMyField"/"setMyField"最初の文字の上に)

私が知っている最良の例は、シリアル化です!これは、データベースまたはファイルに格納するために、バイトシーケンス内の任意のオブジェクトを変換することを可能にします。そして、あなたはこのシーケンスを読むことができますdeserialize元の同じ状態であなたのオブジェクトを取得する。そしてそれは1つの命令でしかありません:)

+0

"unknowオブジェクトで動的に読み書きするためにリフレクションを使用するすべてのライブラリは、これらのgetter/setterを使用します。"それは真実ではない。ゲッター/セッターはリフレクションのために必要ではなく、多くのライブラリはそれらを必要とせず、フィールドアクセスなどのために構成することができます。また、シリアル化はゲッターとセッターに全く関係なく、全く異なるメカニズムであり、問題はありません。 – Kayaman

+0

説明のためにKayamanに感謝...私の説明はすべて悪いです:p(申し訳ありません) – Elloco

関連する問題