2016-07-19 10 views
1

ユーザーが独自の変数を作成して管理できるようにするソフトウェアを開発しています。私は、倍精度浮動小数点数型(Double)、整数、および文字列を作成し、手動で値を設定できるようにしたいと考えています(これはすべてUIで行います)。今私は、これらのユーザー定義変数のすべてを管理するモデルを決定しようとしています。Javaユーザー定義変数の管理方法

私の最初の考えは、私が

Map<String, Variable> myVars; 

...自分の名前で変数をフェッチ地図を持っており、「フリーサイズ」「変数」クラスを使用するとよいでしょうということでした変数クラスにこのような何かを定義することが考え...、

public class Variable<T> 
{ 

private T value; 

public void setValue(T value) 
{ 
    this.value = value; 
} 

public T getValue() 
{ 
    return value; 
} 

} 

はしかし、私はこのアプローチはMap<String, Variable<T> >としてマップを定義するために私を必要だと思うが、私は、マップ全体のための単一のタイプTを選択する必要はありません地図に組み合わせを含めることができます整数、倍精度、および文字列の

2つ目の考えは、文字列、整数、および倍精度のそれぞれに3つの異なるマップを保持するコンテナクラスを作成することでした。 3つのマップは呼び出し元から隔離されており、呼び出し側はゲッターに文字列(変数名)を渡すだけで、コンテナは適切なマップから変数の値を取得します。コンテナは、3つのマップ全体でキーの一意性を維持するなどの問題も処理できます。

スタブは

public class VariableContainer { 

private Map<String, Double> doubleVars = new HashMap(); 
private Map<String, String> stringVars = new HashMap(); 
private Map<String, Integer> intVars = new HashMap(); 

public Object get(String varName) 
{ 
    if (doubleVars.containsKey(varName)) { 
     return doubleVars.get(varName); 
    } else if (stringVars.containsKey(varName)) { 
     return stringVars.get(varName); 
    } else if (intVars.containsKey(varName)) { 
     return intVars.get(varName) 
    } else { 
     // varName not found 
    } 
} 
} 

しかし、今getメソッドの呼び出し元は、返されたオブジェクトの種類を決定するためにinstanceofを用いた検査を行う必要があります...このようになります。そのノートオン

呼び出し側の一部の検査が必要な場合は、多分それはちょうど

Map<String, Object> 

に固執し、抽象Variableクラスやコンテナクラスを忘れるするのが最も簡単でしょう。

はおそらく、まだ別のオプションは、この質問への答えで説明したようにワイルドカードを返すことです: Avoiding Returning Wildcard Types

誰もがこれをアプローチする良い方法上の任意の考えや経験を持っていますか?どのような入力をありがとう。

+1

は、私が思う '地図<文字列、変数>'ので、あなたは、何をしたいです '?' = 'Object'、あなたが必要な'? '' STRING'または 'Number'のいずれかになります。それらは 'Object'のものを除いて共通のメソッドを持っていません。私は 'もしかすると'チェーンが好きではない、それらは悪い習慣になる傾向がある。独自の 'Variable'クラスを使うことはOKですが、後でどのように使うかによって変わるかもしれません。 – markspace

+0

ありがとう、私はそれが動作すると思います。私はフォローアップの投稿をします。 – skrilmps

答えて

0

OKは次のように動作するように表示されます。

public class Variable<T> 
{ 

    private T value; 

    public void setValue(T value) 
    { 
     this.value = value; 
    } 

    public T getValue() 
    { 
     return value; 
    } 

    public String toString() 
    { 
     return value.toString(); 
    } 
} 

Map<String, Variable<?>> myVars = new HashMap<>(); 

Variable<Double> v1 = new Variable<>(); 
v1.setValue(3.0); 

Variable<String> v2 = new Variable<>(); 
v2.setValue("hello"); 

myVars.put("doubleVar", v1); 
myVars.put("stringVar", v2); 

System.out.println("doubleVar = " + myVars.get("doubleVar")); 
System.out.println("stringVar = " + myVars.get("stringVar")); 

上記プリント:

doubleVar = 3.0

STRINGVAR =こんにちはあなたは私たちに関数のオーバーライドをすることができます

0

class Container{ 
    // get(); 
} 
class StringContiner extends Container{ 
    // get() return string; 
} 
class IntContainer extends Container{ 
    // get() return return int; 
} 
class DoubleContainer extends Container{ 
    // get() return double; 
} 
+1

あなたが 'Container'でそれを定義するとき、あなたの帰りはどんなタイプでしょうか? –

+0

親メソッドはオブジェクトタイプ – Zigri2612

+0

である必要がありますが、汎用が必要ですか、間違っていますか? –

関連する問題