14

一部の Message クラスは、タグ番号に基づいてタグ名を返すことができます

。このクラスは何度もインスタンス化されるため、インスタンスごとに HashMap を作成するのは少し気が進まない:

public class Message {
  private HashMap<Integer,String> tagMap;

  public Message() {
    this.tagMap = new HashMap<Integer,String>();
    this.tagMap.put( 1, "tag1Name");
    this.tagMap.put( 2, "tag2Name");
    this.tagMap.put( 3, "tag3Name");
  }

  public String getTagName( int tagNumber) {
    return this.tagMap.get( tagNumber);
  }
}

ハードコーディングを支持して:

public class Message {
  public Message() {
  }

  public String getTagName( int tagNumber) {
    switch( tagNumber) {
      case 1: return "tag1Name";
      case 2: return "tag2Name";
      case 3: return "tag3Name";
      default return null;
    }
  }
}

すべてを組み合わせた場合 (メモリ、パフォーマンス、GC など)、

HashMap に固執する理由はありますか?

4

5 に答える 5

6

MAP静的ブロックで初期化します。

Message.you の多くのオブジェクトを作成するので、このようなコードを記述する必要があります。

public class Message {

  private static HashMap tagMap;

  static {
     tagMap = new HashMap();
     tagMap.put( 1, "tag1Name");
     tagMap.put( 2, "tag2Name");
     tagMap.put( 3, "tag3Name");
  }

  public Message() {

  }

  public String getTagName( int tagNumber) {
    return tagMap.get( tagNumber);
  }
}
于 2012-08-17T09:54:28.557 に答える
1

マップは、キーが条件を表し、値が実行されるコマンドを表すコマンド パターンとして使用できます。唯一の欠点は、使用する前にオブジェクトが作成されることです。そのため、そのような条件が多数ある場合はマップを選択できswitchます。条件は少ないです。

于 2012-08-17T10:06:02.597 に答える
0

getTagName メソッドを静的にし、プロパティ ファイルから遅延ロードしないのはなぜですか?

public static String getTagName(int tagNumber) {
    if tagsByID == null) {
        // load tags from properties
    }
    return tagsByID.get(tagNumber);
}

テストが簡単で、再コンパイルせずに構成可能。

于 2012-08-17T09:55:00.940 に答える
0

すべてのタグ値が間隔内で連続している[1..n]場合は、配列またはおそらく を使用ArrayListして、値に直接アクセスできます。

public class Message {
    private ArrayList<String> tags;

    public Message() {
        this.tags =  = new ArrayList<String>();
        this.tags.add("Unknown");
        this.tags.add("tag1Name");
        this.tags.add("tag2Name");
        this.tags.add("tag3Name");
    }

    public String getTagName(int tagNumber) {
        return this.tags.get(tagNumber);
    }
}

配列との代替。

public class Message {
    private static final String[] tags = {
        "N/A",
        "tag1Name",
        "tag2Name",
        "tag3Name",
        null,
        null,
        "tag6Name",
    };

    public Message() {
    }


    public String getTagName(int tagNumber) {
        if (tagNumber < 0 || tagNumber > tags.length) {
            throw new IllegalArgumentException();
        return tags[tagNumber];
    }
}
于 2012-08-17T09:58:50.343 に答える
0

必要なものによって異なります。たとえば、表示するすべてのタグ名を取得する必要がある場合はMap、さらに、 a に置き換えると、TreeMapそれらを並べ替えることができます。
そのような必要がない場合、 a を使用するMapとオーバーヘッドが発生し、アプローチまたは an のEnum方がはるかに効率的です (ただし、5-10-20caseオプションのオプションよりも読みやすさが低下します) 。

于 2012-08-17T09:50:51.177 に答える