4

私は(Java 1.6で)いくつかの値を(一連のプロパティに対して)保存する必要があるソリューションを実装しようとしており、次の3つを考慮して3つのオプションを考えています(他のアイデアはもちろん大歓迎です!)

オプション1

Propertyさまざまなタイプのオブジェクト (String、int、boolean...) を格納できる クラス ( と呼びます) を作成し、一連のプロパティをList<Property>

何かのようなもの:

private String type; //Store the type of Object
private String name; //Store the name of the property
private String valueStr; //Store the String value
private int valueInt; //Store the int value
private boolean valueBool; //Store the boolean value

多くのプロパティを持ち、そのうちの 1 つだけを使用するという考えはあまり好きではありません。(プロパティごとに 1 つの値のみが設定されます)

オプション 2

ケースごとに型を使用HashMap<String, Object>して解析します。

Property名前で取得できるという利点があります

オプション 3

文字列がプロパティの名前である場所を使用するHashMap<String, Property>と、名前で値を取得でき、解析する必要はありません。

質問は次のとおりです。どれが一番いいと思いますか? または、どれも良くない場合は、他のアイデアを聞きたいです

また、List と HashMap の間にパフォーマンスの違いはありますか?

助けてくれてありがとう。

4

5 に答える 5

4

次のようなカスタム Value クラスを用意する方がよいと思います。

public class MyValue {
    enum Type {
       INT, STRING, BOOL;
    }
    private Type type; //Store the type of Object in Type Enum
    private Object value; //Store the value in Object

    public void setValue(int val) {
       type = Type.INT;
       value = new Integer(val);
    }
    public void setValue(String val) {
       type = Type.STRING;
       value = val;
    }
    public void setValue(boolean val) {
       type = Type.BOOL;
       value = new Boolean(val);
    }

    public String stringVal() {
        // check type to be STRING first
        return (String) value;
    }
    public int intVal() {
        // check type to be INT first
        return ((Integer) value.intValue());
    }
    public boolean booleanVal() {
        // check type to be BOOL first
        return ((Boolean) value.booleanValue());
    }
}

enum Typeゲッターに基づいて Object から特定の型に変換する必要があります。

于 2013-04-25T16:27:33.570 に答える
1

別のオプションは、このようなもので、未使用のフィールドを多数保持するのではなく、継承を使用します。

public interface Property {
    String getType();
    String getName();
    Object getValue();
}

public abstract class AbstractProperty implements Property {
    private final String name;

    protected AbstractProperty(String name) {
        this.name = name;
    }
}

public class StringProperty extends AbstractProperty {
    private final String value;

    public StringProperty(String name, String value) {
        super(name);
        this.value = value;
    }

    @Override
    public String getType() {
        return String.class.getName();
    }

    @Override
    public String getValue() {
        return value;
    }
}

public class IntegerProperty extends AbstractProperty {
    private final Integer value;

    public IntegerProperty(String name, Integer value) {
        super(name);
        this.value = value;
    }

    @Override
    public String getType() {
        return Integer.TYPE.getName();
    }

    @Override
    public Integer getValue() {
        return value;
    }
}
于 2013-04-25T16:27:40.883 に答える
1

オプション 2 が最適だと思います。プロパティを保存していることを考えると、このリストを頻繁にクエリすることになると思います。これは、ルックアップを非常に効率的にするため、HashMap の方向を指します。

于 2013-04-25T16:28:12.003 に答える
1

代わりに を使用することをお勧めしenumます。列挙型は、値のリストを保持するのに適しており、検索に効果的です。

public enum Property {
    TYPE,
    NAME,
    VALUEINT; //...

    private String sProp = "";
    private int iProp = 0;
    private boolean bProp = false;

    public String getStringProp() {return sProp;}
    public int getIntProp() {return iProp;}
    public boolean getBoolProp() {return bProp;}

    public void setStringProp(String str) {this.sProp = str;}
    public void setIntProp(int i) {this.iProp = i;}
    public void setBoolProp(boolean b) {this.bProp = b;}
}

これは 、 などでアクセスできますProperty.TYPEProperty.VALUEINTプロパティは で設定できProperty.TYPE.setStringProp()、 で取得できますProperty.TYPE.getStringProp()

列挙型の詳細については、Oracle のサイトを参照してください。

于 2013-04-25T16:28:14.713 に答える
1

「最善の」方法が1つあるかどうかはわかりません。それは、データ構造に格納した後のデータの使用方法に大きく依存します。

プロパティを蓄積し、それぞれに対して何かを行う必要がある場合は、リストや配列を使用することもあります。

名前などで特定のプロパティを取得する必要がある場合は、HashMap が役立ちます。

ここでも、ネイティブ オブジェクト タイプまたは Property のインスタンスを使用するかどうかは、所有しているデータの種類によって異なります。

どちらのパフォーマンスが優れているかは、所有するオブジェクトの数、それらにアクセスして使用する方法、挿入する頻度、およびその他のいくつかの要因によって異なります。

于 2013-04-25T16:30:14.093 に答える