2011-02-04 12 views
2

複数の可能なデータ型を持っていますJavaオブジェクトをモデル化するための最もメモリ効率的な方法は何である:例えば 最良の方法は、

public class Cell{ 

    short type 

    int _int 
    double _double 
    String _string 
} 

そして、このオブジェクトをインスタンス化し、タイプを設定するとき他のすべてをnullのままにして、適切な値を設定します。 (私はこれも文字列以外の場合はnullメモリがかかります疑う?)

または、各タイプにのみ適切なデータ型を持っているいくつかの一般的なクラスのサブクラスである

public class Cell 
{ 

    short type 
} 
public class StringCell extends Cell 
{ 
    String _string 

} 

。 (サブクラスに関連付けられたメモリオーバーヘッドがあると思われます)

+0

フィールドが設定された後(またはnullに設定されている)、フィールドで何をする予定ですか?継承はあなたが望むように聞こえる。セルはすべてのタイプで共通の動作をしますか?しかし、あなたは細胞の種類に応じていくつかの特別な行動を取るでしょうか? – DaveJohnston

+0

はい、すべての細胞と細胞の特定の仕事にも共通のものがあります。 –

+0

好奇心のために、あなたは通訳を書いていますか? – finnw

答えて

2

これは、タイプが適切な値を設定して他のすべてをnullのままにしておくと言うので、genericsの古典的な問題です。

public class Cell<T> { 
    T value; 
} 

次に、あなたが持つことができる...

Cell<String> stringCell = ... 
Cell<Integer> integerCell = ... 

セルが良好インタフェースを実装した場合であっても、異種タイプされた細胞の明確に定義されたコレクションを持つことができます。

+0

だからパブリッククラスCell { private T t; } ? –

+0

これはおそらくこれをモデル化する良い方法ですが、必ずしも質問の最初の文章であった "メモリ効率的"ではありません。整数の中にプリミティブintを格納するのは効率的ではありません。さらに64ビットJVMで。 – rfeak

+0

しかし、私はジェネリックとしてクラスに渡されるものを制御できません。誰かがCell と言うことができるのは、制限したいプリミティブだけではない –

0

あなたはこれを考えています。これが本当に必要な場合は、プリミティブに固執し、Flyweight patternが役立つかどうかを調べてください。

+0

はい、Flyweightは共有文字列に役立ちますが、これは別の最適化です。 –

0

int、long、float、doubleのプリミティブで作業する必要がある場合は、最も効率的な方法でプリミティブを使用します。ただし、nullに設定することは不可能です。クラス内で宣言するだけで、スペースを取ることになります。

サブクラスのアプローチを使用しても問題ありませんが、基本クラスはどのような価値がありますか?私は、プリミティブ型ごとに異なる実装を使用して、インタフェースに頼っています。そうすれば、継承オーバーヘッドはありません(私は疑問に思っていますが)。そして必要なプリミティブしかありません。

私はまだあなたがそのインターフェイスに置くだろうかと疑問に思う。おそらくRenderメソッドのいくつかの並べ替えですか?