[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends-ml 1551] Re: 集約とコンポ ジション



高橋(徹)です。

   "前橋 和弥 <PXU00211@xxxxxxxxxxx>"さんは書きました:
> > > Toru TAKAHASHI <tooru6.takahashi@xxxxxxxxxxxxx> wrote:
> > privateなinner classを定義したら、クラス外部からはアクセスされない
> > ことが実現できると思いますが、いかがでしょう?
:
> innerクラスは、ActionListenerなどのように、スーパクラスや
> インタフェースを外に出す使い方が多いので、やっぱり例として
> 不適切ではないかと。
外側のクラス内部にprivateなインナークラスを定義すると、その他の
クラスに対して隠蔽できるのですが、コンポジションはそれを直接の目的
とはしていないですね。
ライフサイクルを一致させるには、プログラマのマナーで記述しないと
Javaでは苦しいですね。思い付くのは、private finalで全体/部分の部分
となるフィールドを宣言してコンストラクタで1回だけnewするという方法
です。
#ただ、フィールドでpart = null;として宣言してしまうと、もう有効な
#オブジェクトの参照を代入できなくなってしまうのが難点。。。

public class Composite {
  private final Part part; // = null; としてはNG
  public Composite() {
    :
    part = new Part(...);
  }
  :
}

> また、例えばRectangleが、左下と右上の座標をPoint2Dで持つ場合、
> このPoint2DはライフサイクルをRectangleと共有しますが、まさか
> Rectangleのinnerクラスにはできんでしょう。他で問題でまくりです。
Rectangleクラスが公開している操作でPoint2Dを使用することと、内部
で保持(集約あるいはコンポジション)している属性である座標にPoint2D
を使用することは、特定の実装系でたまたま一致しているだけで、要件に
よっては異なる型する設計もあり得ると思います。そのときは、外部には
見せたくない内部で保有している型はinnerにするというのもありかと。。。

> こういうことは、以前JavaHouseに書いたことがあって、
「newするのが面倒」を除いてはほぼ同意します。
C++で、newで代入したらコンパイルエラーになって、えらく悩んでしまった。
  Foo foo = new Foo();   // エラー。Foo* foo = new Foo();にしないと
これは慣れの問題に属すると思います。

> Java本の話も来てたりするので、ネタ集めおよびちょっと公開して様子見、
> なんて意図もあったりする... (^^;
おおっ。「Java言語 リファレンス完全制覇?」なんて題名だったり???

======------======------======
Toru Takahashi,  TOSHIBA Corps. KOMUKAI Works
(office)tooru6.takahashi@xxxxxxxxxxxxx
(private)torutk@xxxxxxxxxxx
http://www.alles.or.jp/~torutk/oojava/