Index: [Article Count Order] [Thread]

Date:  Thu, 15 Jun 2000 01:11:18 +0900
From:  "Hisashi Yoshida" <steven@....jp>
Subject:  [XP-jp:00538] Re: XP Installed26 Part1 Test-first, by Intetion
To:  extremeprogramming-jp@....jp (extremeprogramming-jp ML)
Message-Id:  <006f01bfd61b$947c5320$281e140a@tokura>
References:  <200006101349.WAA31357@....nu>
Posted:  Thu, 15 Jun 2000 01:13:15 +0900
X-Mail-Count: 00538

よしだです。

#やはり、全体に対してはコメントが書きにくい(論点が不明になって
#しまう。変換した後の文章が「大作」なので…。)ので、部分的な
#コメントにします。

コンストラクタについて:

Javaではコンストラクタの実行順序を考慮しないと行けないと思いま
すので以下のような差があります。

> <Smalltalk>
> === Page 191 Code 3
> 
>     setName:aString amount:aNumber
>          name:=aString
>          amount:=aNumber
> </Smalltalk>

>     /*
>         しかし、実際にはつぎのようなものでも十分かもしれません。
>     */
>         private /* or protected */ void setNameAndAmount(String aString, int aNumber){
>             name = aString;
>             amount = aNumber;
>         }

Javaでは、ここではprivate以外ではいけません。理由は「オブジェクト生成」
の動作の違いにあります。「初期化」目的のメソッドですので、コンストラクタで
使用されますが、サブクラスでオーバーライドできてしまうと、例えば、以下のよ
うな問題となります。

class Base {
    String name_;

    Base(String name) {
        setName(name);
    }

    protected void setName(String name) {
        name_ = name;
        System.out.println(name_);
    }
}

class Foo extends Base {
    String fooSuffix_ = "Foo";

    Foo(String name) {
        super(name);
    }

    /**
     * new Foo("名前")の結果が、"名前Foo"となることを期待している
     * が、うまく行きません。コンストラクタと生成の順序を考えましょ
     * う。
     */
    protected void setName(String name) {
        /* 自分のインスタンス変数(fooSuffix_)が問題。*/
        name_ = name + fooSuffix_;
        System.out.println(name_);
    }
}

まだ、superのコンストラクタ実行中は、インスタンス変数fooSuffix_が設
定されてないわけです。newというメッセージによって具象オブジェクトが
できてしまってからConstructor Parameter Methodが呼び出される
Smalltalk とは異なるわけです。(実際にはprivateプロトコルに置くので
同様のことを考慮している?かもしれないですが。)

#あまり良い例でないかな。
--
吉田 尚志 steven@....jp