2016-04-15 17 views
-2

私は運動指導者とパラメータ化されたコンストラクタについて議論しました。彼は、2つ以上のコンストラクタ、特にパラメータ化されたコンストラクタを持つことは悪い習慣であると言いました。コンストラクタの代わりに空のコンストラクタを1つだけ使用し、ファクトリメソッドのパターンを初期化する必要があります。Javaでパラメータ化されたコンストラクタ

これが初めてです。このようなことを聞​​いたことがあります。私は研究をしましたが、関連するものは何も見つかりませんでした。私が見つけた唯一の悪い習慣は、以下のとおりです。コンストラクタの内部保護/パブリックメソッドを使用して、コンストラクタ

  • 内部

    • あまりにも多くのパラメータ(子クラスはメソッドをオーバーライドすることができますので)
    • 野生計算

    私の質問は、ベストプラクティスは何ですか?コンストラクタ内でインスタンス変数を設定しても問題ないですか、アドバイスに従い、ファクトリメソッドパターンを使用する必要がありますか?

  • +7

    これはまさに彼の意見のようなものです。 –

    +0

    2つ以上のコンストラクタを持つのは問題ありませんが、チェーン化しないと結果が矛盾することがあります。例えば、[この質問](http://stackoverflow.com/q/25272784/217324)を参照してください。あなたの専門用語は、おそらく、 "クラス変数"ではなく "インスタンス変数"を意味します –

    +0

    ビルダーパターンを意味していますか? –

    答えて

    0

    ファクトリメソッドを使用するか複数のコンストラクタを使用するかは、実際には個人的な好みです。特に、コンストラクタ参照をファクトリとして簡単に使用できるJava 8の場合(これはすべて実際には - オブジェクトのインスタンスを作成するファクトリ)。あるクラスにコンストラクタが複数存在するのはまったく問題ありません。クラス内にコンストラクタがたくさんある場合は、があまりにも多いクラスの記号で、を工場に切り替える必要はありません。クラスが特定の入力を有効にする必要があり、null/0が正常なデフォルト値でない場合、コンストラクターを非常に多くパラメータ化する必要があります。

    しかし、避けるべきことは、オブジェクトが無効な状態で存在することです。私は工場を無視して直接new MyList()を呼び出し、私もsetBackingArray()を呼び出すまで、オブジェクトが、本質的に無効である可能性があるため

    public class MyList { 
    
        private Object[] backingArray; 
    
        public void setBackingArray(Object[] backingArray) { 
         this.backingArray = backingArray; 
        } 
    } 
    
    public class MyListFactory() { 
    
        MyList newMyList(int initialSize) { 
         MyList list = new MyList(); 
         list.setBackingArray(new Object[initialSize]); 
         return list; 
        } 
    
    
    
        MyList newMyList() { 
         MyList list = new MyList(); 
         list.setBackingArray(new Object[defaultSize]); 
         return list; 
        } 
    } 
    

    これは悪いデザインの例は次のとおりです。たとえば、以下のクラスと工場を検討してください。ファクトリパターンを使用する場合は、ファクトリを経由せずに他のコードが直接オブジェクトを作成できないように注意する必要があります。 (上記のクラスは他の理由のために悪いですが、私が作ろうとしているポイントには関係ありません)。

    0

    ベストプラクティスは、あなた次第であり、あなた次第です。 プロジェクトロンボク(https://projectlombok.org)を使用することをお勧めします。 クラス@AllArgsConstructorでアノテーションを使用すると、自動的に作成されます。また、最後のフィールドに@RequiredArgsConstructorを使用することもできます。 getterとsetterの自動作成には多くの可能性があります。したがって、コードは短くて読みやすくなります。