4

Java のコーディングを約 4 か月間行っています。入門書のガイドを使って Android ゲームのコーディングを始めたところです。この本では、それらはクラスの属性をカプセル化していません。

元。

public class GameObject{
    public Vector position;
    public float angle;

    public GameObject(float angle, Vector position){
...

私は常々、属性のカプセル化は良い習慣であると言われてきました: getter メソッドと setter メソッドを介したプライベート属性へのアクセスのみを許可します。

私よりも経験豊富なプログラマーが、属性を作成するための「適切な」コーディング方法を教えてもらえますか? そしてもちろん、なぜお願いしますか?

そしてフォローアップ: クラスのプライベート属性を常にカプセル化し、getter メソッドと setter メソッドを提供する必要がありますか、それとも public 属性が問題ない状況がありますか?

4

5 に答える 5

12

カプセル化は、オブジェクト指向プログラミングの中心的な概念の 1 つです。私の意見では、ゲッターとセッターを使用することは常に良い習慣です。避けるべきことの 1 つは、外部エンティティがクラスの内部構造を意のままに台無しにすることです。

典型的な例として、パラメータを持つことを検討してdateOfBirthください。setterとを使用するとgetter、小さな検証プロセスを実行して、ユーザーが将来生まれていないこと、または信じられないほど古いことを確認できます。セッターを使用して、年齢などの他のフィールドを更新することもできます。

これらの getter および setter を呼び出す他のクラスでこのチェックを行う必要がないため、この小さな検証によってコードの再利用性も向上します。

于 2013-08-09T06:04:43.960 に答える
4

純粋な見方を脇に置くと、ゲッターとセッターを使用する正当な理由が 2 つ残されます。

  1. 動作を変更したい場合に、将来行う必要があるコード変更の量を減らします。突然必要になった次のケースを考えてみましょう - 一部の入力を検証する、一部のフィールドを計算する、または変更時に他のフィールドに影響を与える、get または set 操作の範囲を制限する、または不均一にする、いくつかのフィールドの動作を変更する継承されたクラスまたは奇妙な方法でフィールドを保存します。ゲッターとセッターが既に配置されている場合、これらの変更には、変更自体以外に費用はかかりません。そうでない場合は、プロジェクト内のフィールドのすべての使用法を変更する必要があります。

  2. これにより、ゲッターまたはセッターを必要とするインターフェイスを実装できます。

于 2013-08-09T06:29:09.470 に答える
0

カプセル化により、柔軟性が向上します。より詳細な制御が可能になり、実装の詳細が隠されます。set メソッドを提供しなくても、クラスの可変性を減らすことができます。ゲッターとセッターには、追加のロジックを含めることができます。パブリック API を変更する必要なく、クラスの実装を変更する方が簡単です (ゲッターとセッターはパブリック API の一部です)。

于 2013-08-09T06:16:15.170 に答える
0

アクセサー/ゲッター - インスタンス変数の値を検査するために使用されるパブリック メソッド クライアントがクラスを使用できるようにするために、ADT の実装者は、多くの場合、ユーザーが「見る」ことができるようにする 1 つ以上のパブリック関数を提供する必要があります (検査) オブジェクトのプライベート インスタンス変数の現在の値。これらの「読み取り専用」タイプのメソッドは、アクセサー関数と呼ばれます。

たとえば、クラス TwoDice の 2 つの適切なアクセサ関数は getDice1() と getDice2() で、サイコロの 1 つの現在の値を見つけるために使用できます。getDice1() の定義は次のとおりです。

  public int getDice1()
   {
      return dice1 ;
   }

getDice2() の同様の定義を使用します。以下に示すように、これらの関数を使用して、最初のサイコロの値を整数変数 valueOfDie1 に格納できます。

   TwoDice roll = new TwoDice() ;
   int valueOfDie1 = roll.getDice1() ;

メソッド呼び出し roll.getDice1() では、オブジェクト roll が現在のオブジェクト (メソッドが呼び出されるオブジェクト) であるため、このオブジェクトに getDice1() を適用すると値 roll.dice1 が返されます。

Mutators /Setters - インスタンス変数の値を変更するために使用されるパブリック メソッド。ミューテーターには、インスタンス変数の値が許容範囲を超えないようにするためのデータ検証を含める必要があります。たとえば、TwoDice クラスには、TwoDice オブジェクトが作成されると、その値を変更できないという興味深いプロパティがあります。クライアント コードで変更できるようにするパブリック メソッドは提供されていません。このようなオブジェクトは不変であると言われます。つまり、一度作成すると変更することはできません。多くの Java 独自のクラスには、不変オブジェクトのみを提供するというこのプロパティがあります。そのような 2 つの例は、String クラスと Color クラスです。

クラス デザイナーは、多くの場合、ミューテーターまたはセッター メソッドと呼ばれるものを提供して、クライアント コードがオブジェクトの値を変更できるようにします。これは、個人データのセキュリティを侵害する可能性があるため、潜在的に危険です。したがって、ADT の実装者は、属性 (インスタンス変数) の値が許容値の範囲内で適切に設定されるように、適切なデータ検証を提供することが不可欠です。TwoDice クラスの適切なミューテーター メソッドは setDice1( int n ) と setDice2( int n ) であり、これらの最初の定義を以下に示します。

 public void setDice1( int n )
   {
      assert (n >= 1) && (n <= 6) : "value of dice1 out of range: " + n ;
      dice1 = n ;
   } 

ここで興味深いのは、偽と評価された場合にプログラムの実行が終了するアサーションの使用です。

于 2013-08-09T06:17:25.513 に答える