を作業している場合には、両方の技術はひどいですが、ゲッターを使用すると、一般的な(そして安全な)練習でそれを使用する良いだろう。
クラスのパブリックデータメンバー(パブリックフィールドまたはパブリックプロパティ)にアクセスするには、クラスの実装の詳細(データメンバー名とデータメンバータイプ)を知っている必要があります。これは悪いことです。 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の一部です。
多くのリソース[ここ](http://stackoverflow.com/q/1568091/387852)、[ここ](http://stackoverflow.com/q/565095/387852)、[ここではhttp ://stackoverflow.com/q/996179/387852)。 –
しかし、オブジェクトを表す50個の変数があるとどうなりますか?たとえば、Carというオブジェクトがあり、carType、carColor、carHP、carMaker、carName、carWheelBase、carMPG、carTransmission、carEngineなどの変数があるとします。ゲッターを作成する必要がありますかそれぞれのセッター?それは余分なコーディングのトンのようだ... – SkyeBoniwell
現代のIDE(Eclipseのような)は自動的にそれを行うことができます。しかし、これらの変数を外部に公開する必要があるかどうかを自問する必要があります。カプセル化の良い原則に違反していますか? –