2016-05-02 11 views
0

私は非常に複雑なクラスのAComplexを持っています。これにはプライベートメンバーがたくさん含まれていますが、今はクラスのパブリックバージョン(ASimple_V1)を作成したいと思います。プライベートメンバーのサブセットのみを含み、それらを公開しました。Javaクラスのメンバーのサブセットを抽象化する方法を改善する

class AComplex{ 
    private T1 t1; 
    private T2 t2; 
    .... 
} 

class ASimple_V1{ 
    public T1 t1; 
    public T2 t2; 
} 

class ASimple_V2 extends ASimple_V1{ 
    public T3 t3; 
    public ASimple_V2(AComplex a){ 
     t1 = a.t1; 
     t2 = a.t2; 
     t3 = a.t3; 
    } 
} 

は、私が使用します。また、後で私は、以前のバージョンに基づいて複数のバージョンをしたいのですが..私が持っていた現在のソリューションは本当に不器用である(例えば、ASimple_V2は、ASimple_V1に基づいていますが、はAComplexからより多くを追加しました)複雑なクラスをparamとして取るコンストラクタは、手動ですべての値を割り当てる必要があります。そのような目標を達成するためのより良い方法はありますか?

答えて

0

プロパティの手動コピーを避けることについては、ApacheのコモンズからBeanUtilsをご覧ください。ソースと宛先のBeanの名前を一致させる必要があり、クラスはJavabeansの規則を確認する必要があります。

ASimple_V2では、「複雑なオブジェクト」を参照するだけです。あなたが行ったように、複雑なクラスの「より単純なコピー」を作成することは、標準的な方法ではありません。クラスの設計を改善するために、他にもいくつかの変更が可能です。一般的には、公共分野を持つのは良いOOの習慣ではありません。あなたが複雑なクラスで持っているものはおそらくプライベートフィールドのゲッターです。

0

あなたはあなたの問題を反射で解決することができます this.getClass().getDeclaredFields() しかし、私はあなたのコードを再構成する方が良いと思います。

は、この質問の受け入れ答えでroufamaticのコメントを参照してください。すべてのJava reflection: Find fields of a subclass

0

まず、privateフィールドは、通常は、実装固有の詳細が含まれていると隠しままにしてください。隠れたままにしておくと、APIに影響を与えずにクラスの実装方法を柔軟に変更できます。公開して公開することで、エクスポート可能なAPIの一部となり、永遠にそれらに執着します。

自分自身に質問する必要がある最初の質問は、「なぜこれらのフィールドはプライベートではないのですか?説得力のある理由がある場合は、公開するかどうかを慎重に検討する必要があります。しばしば、それはまだ悪い考えです(否定的な例として、java.awt.Pointクラスを見てください)。フィールドを公開する代わりに、アクセサメソッドを提供する必要があります。 getT1およびgetT2。これにより、後で実装を変更する柔軟性が向上します。ビルドアウトのようにクラス階層を

最後に、どのようにバージョン間equals/hashCode契約---具体的には、再帰関係(v1.equals(v2)==true、中としてではなく、v2.equals(v1)==false)を維持することを計画していますか?

私の推奨:できるだけ多くのフィールドを保持してください。privateフィールドを公開する必要がある場合は、public getterメソッドを使用します。 Eclipseには、ゲッターとセッターを生成するための自動化されたツールがあります。

関連する問題