2012-02-09 15 views
6

変数を2通り呼び出すことができます。別のクラスから変数を取得する適切な方法

一つは、ちょうどこのようにそれを行うことです。

MyClass myClass = new MyClass();  

myLocalVar = myClass.myVarVal; 

そして他の方法のようにゲッターを使用することです:

myLocalVar = myClass.getMyVarVal(); 

どちらの方法が正常に動作しているが、私は何を思っていましたこれを行う最も効率的/適切な方法でしょうか?あなたは常に第二の代替で行くべきencapsulationさのために

おかげ

+3

多くのリソース[ここ](http://stackoverflow.com/q/1568091/387852)、[ここ](http://stackoverflow.com/q/565095/387852)、[ここではhttp ://stackoverflow.com/q/996179/387852)。 –

+0

しかし、オブジェクトを表す50個の変数があるとどうなりますか?たとえば、Carというオブジェクトがあり、carType、carColor、carHP、carMaker、carName、carWheelBase、carMPG、carTransmission、carEngineなどの変数があるとします。ゲッターを作成する必要がありますかそれぞれのセッター?それは余分なコーディングのトンのようだ... – SkyeBoniwell

+2

現代のIDE(Eclipseのような)は自動的にそれを行うことができます。しかし、これらの変数を外部に公開する必要があるかどうかを自問する必要があります。カプセル化の良い原則に違反していますか? –

答えて

11

を作業している場合には、両方の技術はひどいですが、ゲッターを使用すると、一般的な(そして安全な)練習でそれを使用する良いだろう。

クラスのパブリックデータメンバー(パブリックフィールドまたはパブリックプロパティ)にアクセスするには、クラスの実装の詳細(データメンバー名とデータメンバータイプ)を知っている必要があります。これは悪いことです。 OOPの概念「情報隠蔽」を破り、「結合」を増加させる。

ゲッターの使い方も悪いです(悪いOOPの習慣のように)。なぜなら、オブジェクトは単なるデータラッパーではないからです。オブジェクトは機能とデータをカプセル化しています。 「これをここに保存して、後で入手できるようにする」機能性ではありません。それは馬鹿の機能です(ケージの猿の猿のように)。ゲッターは、しかし、java(そしてC++やC#のような他のOOP-lite言語)では認められている習慣です。

私はいくつかのアイボリーの塔純粋だと思うのですが、もちろん私はゲッターを使います。私はJavaを使用するので、私はgettersを使用します。

getterは "良いoopプログラマー"ではないゲッターを使用すると、 "IR gud OOP Prgmr"と信じて回り歩くのではなく、仕事をするプログラマー。

編集:おそらくもっと良い方法です。

より良い方法は、ゲッターを使用するのではなく、データではなく機能を公開するようにクラスを設計することです。実際には、これが崩壊するポイントがあります。たとえば、JSPページにアドレスを表示する必要がある場合は、リクエスト(またはセッションまたはblah)にアドレスを指定してBeanを配置し、ゲッターを使用して値を公開します。 「より多くの純粋な」方法は、「jsp上のアドレスを表示する」機能を公開したBeanを置くことです。

Edit2:おそらくもっと良い例です。

私はアメリカの電話会社で働いているといい、顧客の電話番号を表すオブジェクトがあります。これは、次のようになります。

public class CustomerPhoneNumber 
{ 
    private String npa; // numbering plan area (google search nanp for more details) 
    private String nxx; // exchange. 
    private String serviceNumber; 

    public String toString() 
    { 
    return "(" + npa + ") " + nxx + "-" + serviceNumber; 
    } 

    public boolean equals(Object object) 
    { 
    ... standard equals implementation (assume this works) 
    } 
} 

は、今私は、フォームString inputPhoneNumberでWebページからの入力として電話番号を取得すると言います。議論の目的のために、この入力を受け取るクラスは「サーブレット」と呼ばれます。

この質問にはどのように答えることができますか?「私のCustomerPhoneNumberオブジェクトのリストに入力された電話番号はありますか?

オプション1は、npa、nxx、およびserviceNumberデータメンバーをパブリックにしてアクセスします。これはひどい。

オプション2は、npa、nxx、およびサービス番号のゲッターを入力し、入力と比較します。またひどい、あまりにも多くの内部の詳細が公開されています。

オプション3は、フォーマットされた電話番号(私は上記のtoString()と呼ばれています)を返すゲッターを提供します。サーブレットはゲッターで使用されるフォーマットを知っていなければならず、入力が同じようにフォーマットされていることを保証しなければならないので、これはよりスマートですがひどいです。

オプション4(これは「OOPへようこそ」と呼ばれます)では、文字列を受け取り、顧客サービス番号と一致する場合はtrueを返すメソッドを提供します。これは優れているとこのようになります(名前が長いですが、この例には十分):なし実装の詳細が公開されていないので、

public boolean doesPhoneNumberMatchThisInput(final String input) 
{ 
    String formattedInput; 
    String formattedCustomerPhoneNumber = npa + nxx + serviceNumber; 

    formattedInput = ... strip all non-digits from input. 

    return StringUtils.equals(formattedCustomerPhoneNumber, formattedInput); 
} 

これが勝者です。また、toStringを使用して、JSPページの電話番号を出力することもできます。

StringUtilsはApache Commons Langの一部です。

+0

良い方法があるのか​​ゲッターだけが必要な悪いのですか? – SkyeBoniwell

+0

より詳しい説明をお探しの方には[ここの優れた記事があります](http://www.yegor256.com/2014/09/16/getters-and-setters-are-evil.html)非常に分かりやすい類推のためのボールと犬の*セクション。) –

8

myLocalVar = myClass.getMyVarVal(); 

あなたは効率を賢明にして差異に気づくことはありません。

4

getterとsetterを使用してプロパティにアクセスすることはありますか?

thisもご覧ください。

1

myClass.getMyVarVal()は、メソッド呼び出しであるため、スタック上に戻り値などのエントリを作成するため、処理速度が遅くなります。しかし、getterを使用する方が良いOOP慣行です。

+2

Java言語では、メソッド呼び出しをそのように実装する必要がありません。実際には、そのようなメソッドがインライン化される可能性が最も高いです。 – aioobe

1
myLocalVar = myClass.getMyVarVal(); 

あなたはOOPコンセプトで

2

オブジェクトを作成するだけで、object.variablename;またはobject.methodName();を使用して静的でない参照を作成することができます... getterを使用する必要はありません。

関連する問題