1

あなたが持っているクラスを持っていると仮定しDogます

public class Dog {

    private String name;
    private double age;

    // some setters
    // some getters

DogHandlerさらに、のインスタンスを作成してDog dに渡すクラスがありますOwner

私は、私ができると思います

...に渡す前に犬のコピーを作成しますが、これOwnerはコストのかかる操作であり、避けたいと思います。

Dog...ゲッターのみを含むを実装するインターフェースを考え出し、 Dogそのインターフェースにキャストして結果を渡します

...コンストラクターで設定可能な変数を初期化し、オブジェクトのこのインスタンスの変更を許可しない

オブジェクトの受信者がオブジェクトを変更できないようにする他の方法はありますか?

データを含む単純なBeanを取得して、読み取り専用にする方法を教えてください。

4

4 に答える 4

2

これはいくつかの方法で達成できますが、そのうちの 2 つを提案できます。

a)ゲッターとのインターフェースは良い考えです

b) 次のように、setter メソッドがブロックされている Dog から派生クラスを作成します。

class UnmodifiedDog extends Dog {
    public UnmodifiedDog(double age, String name) {
        super.setAge(age);
        super.setName(name);
    }
    @Override
    public void setAge(double age) {
        throw new UnsupportedOperationException();
    }

    @Override
    public void setName(String name) {
         throw new UnsupportedOperationException();
    }   
}

DogHandler で:

Dog createDog() {
    return new UnmodifiedDog(10, "Fido");
}

これを所有者に渡すことができます:

owner.receiveDog(dogHandler.createDog());
于 2011-09-21T20:04:57.200 に答える
0

これは、インターフェイスとパッケージアクセスセッターを使用した例です。


package blah.animal;
public interface Dog
{
  double getAge();
  String getName();
}

package blah.animal;
public class DogImpl implements Dog
{
  private double age; // double seems wrong for age.
  private String name;

  ... getters (defined by Dog interface)

  // package access setters.
  void setAge(double newValue)
  {
    age = newValue;
  }

  void setName(String newValue)
  {
    name = newValue;
  }

  package blah.animal;
  public class DogHandler
  {
    public static Dog newDog(double age, String name)
    {
      Dog returnValue = new DogImpl();
      returnValue.setAge(age);
      returnValue.setName(name);

      return returnValue;
    }
  }

  package.blah.somethingelse;
  public class Blam
  {
    private Dog myDog;

    public Blam()
    {
      myDog = DogHandler.newDog(1.4D, "Tippy");
    }
  }
于 2011-09-21T20:39:19.700 に答える
0

質問で言及するアプローチは、Dog不変にするための標準的な手順です。他の唯一のヒントはDog、クラスをであると宣言することによってオーバーライドできないことを義務付けることfinalです。

于 2011-09-21T20:09:55.087 に答える
0

ここで説明するソリューションの中で、可視性修飾子を利用することもできます。Dogとが別々のパッケージにある場合Ownerは、ミューテーターの可視性をデフォルト(パッケージ)スコープまたは保護されたスコープに設定できます。

これにより、オブジェクトを分離したまま(したがって、オブジェクトに変更を加えないように)、同じパッケージを維持できます(したがって、両方がそれに応じてオブジェクトを変更DogできDogHandlerますDog)。OwnerDog

于 2011-09-21T20:21:57.703 に答える