2016-09-05 19 views
0

私は2つの非常に似たクラス(多くの変数を共有しています)を持っています。このように簡略化:他の子への親から子へのキャスト

abstract class AbstractPreferred 
{ 
    public boolean a; 
    public int  b; 
    /* ... */ 
    public float  z; 
    /* ... */ 
    /* getters and setters */ 
} 
class ClassForJacksonDatabind extends AbstractPreferred 
{ 
    public HashMap<String,Double> different; 
    /* getter and setter for different */ 
    public Preferred toPreferred() 
    { 
     Preferred p = (AbstractPreferred) this; 
     p->convertDifferent(this.different); 
     return p; 
    } 
} 
class Preferred extends AbstractPreferred 
{ 
    protected HashMap<Integer,Double> different; 
    /* getters and setters */ 
    public void convertDifferent(HashMap<String,Double> d) 
    { 
     /* conversion */ 
    } 
} 

しかし、明らかにそれが動作しません:私は、すべて単一の共有変数のコピーを手動で回避したいと思いますので

class ClassForJacksonDatabind 
{ 
    public boolean a; 
    public int  b; 
    /* ... */ 
    public float  z; 
    /* ... */ 
    public HashMap<String,Double> different; 
} 
class Preferred 
{ 
    protected boolean a; 
    protected int  b; 
    /* ... */ 
    protected float  z; 
    /* ... */ 
    protected HashMap<Integer,Double> different; 
    /* getters and setters */ 
} 

、私はこのアイデアを思い付きました。それができる方法はありますか?私の主な目的は、このような何かをしなければならないということを避けている:

public Preferred toPreferred() 
{ 
    Preferred p = new Preffered(); 
    p.setA(this.a); 
    p.setB(this.b); 
    /* ... */ 
    p.setZ(this.z); 
    p.setAa(this.aa); 
    /* ... */ 
    p.setZz(this.zz); 
    p.convertDifferent(this.different); 
} 

または

public Preferred toPreferred() 
{ 
    Preferred p = new Preferred(this); 
    p.convertDifferent(this.different); 
} 
/* ... */ 
Preferred(AbstractPreferred other) 
{ 
    this.a = other.a; 
    this.b = other.b; 
    /* ... */ 
    this.zz = other.zz; 
} 

ClassForJacksonDatabindの構造はI限り(外部JSONファイルから導出されたので、私はそれを変更することはできません知っている、とにかく)。

+0

あるクラスから別のクラスに変換するためのメソッドを使用して、ユーティリティクラスを作成できます。 2つのクラスの間に関係はありますか? – Slimu

+0

あなたは実際にその変換が本当に必要ですか?基本的なHashMap 構造体のビューを提供することで、HashMap インターフェースを模倣するためにコンポジションを使用すると想像することができます。 – Fildor

+0

@Fildorその変換の主な目的は、プログラムのたとえば、整数キーは文字列キーよりも大幅に少ないメモリを占有します。変換後、古いオブジェクトはガベージコレクションされ、プログラムの集中的な主要部分の作業メモリが解放されます。 – joelproko

答えて

1

Dozerのように、オブジェクトからオブジェクトへのマッピングには多くのライブラリがあります。あなたは本当にホイールを再発明して、あなた自身のマッパーを作りたいですか?

+0

ニース、ありがとう。 :D – joelproko

関連する問題