2016-04-26 7 views
2

私はmyArrayListにすでに値が入っています。この例では、その中に2つの要素(firstNameとlastName)しかないとします。私はmyArrayListから値を取得し、文字列にそれらを比較する必要があり、それが一致したならば、豆から値を取得し、マップにそれを置く:あなたはmyArrayListで三〇から四〇要素を持っているときより良いデザインパターン?

 Map<String,String> myMap; 
     for(String element: myArrayList){ 
       if(element.equalsIgnoreCase("firstName")){ 
        myMap.put("firstName", bean.getFirstName()); 
       }else if(element.equalsIgnoreCase("lastName")){ 
        myMap.put("lastName", bean.getLastName()); 
       } 
     } 

問題があるあなたが持っているだろうパフォーマンス上の問題(私が想定している)、それはちょうどいい気分にはならない。

私はこれを試してみました:

 String name = null; 
     String value = null; 
     for(int i = 0; i < myArrayList.size(); i++){ 
      name = myArrayList.get(i); 
      value = bean.get(name); 
      myMap.put(name, value); 
     } 

しかしライン "値= bean.get(名);"

public class Bean implements Serializable { 
    private String firstName; 
    private String lastName; 

    public String getFirstName(){ 
     return firstName; 
    } 

    public void setFirstName(String firstName){ 
     this.firstName = firstName; 
    } 

    public String getLastName(){ 
     return lastName; 
    } 

    public void setLastName(String lastName){ 
     this.lastName = lastName; 
    } 

} 

は、今私が来る可能性がどのように考えています:Beanクラスで定義されていない、確かに我々は、Beanクラスでは、このようなメソッドを持っていない、それだけで、標準のgetterメソッドとsetterメソッドを持っている(文字列)というメソッドが得ると言っています私のロジックを最適化し、コードのパフォーマンスに影響を与えないいくつかのデザインパターンがあります。お気軽に質問してください、あなたがもっと情報を必要とする場合は編集します。どんな助けでも大歓迎です。ありがとう。

編集:shmoselの答えは私にとってはかなり良かった、あなたの助けをすべてありがとう!乾杯!

+1

30〜40個の要素では、最適化から大幅な改善は見られませんが、1000個の要素があります。 (より洗練されたコードを意味するならば、それでも最適化するのは良いことです) – 4castle

+3

あなたは反射を使ってBeanのプロパティを取得しようとしているようです。 http://stackoverflow.com/questions/5856895/java-reflection-beans-property-apiを参照することもできますが、リフレクションの使用にはパフォーマンス上のオーバーヘッドがあることに注意してください。 Java 8を使用している場合は、( "lastName"、Bean :: getLastName)のような値を持つHas​​hMap >を名前で素早く検索することができます。 –

+0

http://stackoverflow.com/questions/8524011/java-reflection-how-can-i-get-the-all-getter-methods-of-a-java-class-and-invoke –

答えて

1

@HankDと@Nataliaは、いくつかの有効なソリューションを提供してきましたが、私が言及した表示されていない別のオプションはget(String)方法をサポートするためにBeanをリファクタリングされている。

public class Bean implements Serializable { 
    private Map<String, String> properties = new HashMap<>(); 

    public String get(String property) { 
     return properties.get(property); 
    } 

    public void set(String property, String value) { 
     properties.put(property, value); 
    } 

    public String getFirstName(){ 
     return get("firstName"); 
    } 

    public void setFirstName(String firstName){ 
     set("firstName", firstName); 
    } 

    public String getLastName(){ 
     return get("lastName"); 
    } 

    public void setLastName(String lastName){ 
     set("lastName", lastName); 
    } 

} 
+0

私はこのソリューションが本当に好きです。理解するのは非常に簡単ですが、人々が保存できるプロパティを強制することもなく、汚いと感じます。また、最適化するかどうかもわかりません。 – 4castle

+0

プロパティのセットを制限する場合は、プロパティフィールドの文字列の代わりにenumを使用します。 –

+0

@ 4castle、 'set()'はプロパティを制限するためにプライベートにすることができます。私の目標は最適化ではありませんでしたが、それが本当にOPの目標かどうか疑問があります。私は、get()がif-elseチェーンよりも優れたパフォーマンスを発揮すると期待しています。スイッチは異なる場合があります。 – shmosel

0

これは奇妙なやり方です。 4castleが指摘しているように、いくつかの要素がパフォーマンスの問題を引き起こす可能性は低いです。パフォーマンスの問題が発生していますか?それは私だった場合

、私はこのような何かをしたい:

public static final String lastNameValue = "lastname"; 

for(String element: myArrayList){ 
    if(element != null) element = element.toLowerCase(); 

    if(lastNameValue.equals(element){ 
     myMap.put("lastName", bean.getLastName()); 
    } .... 
} 

定数は、新しいStringを構築このメソッドが呼び出されるたびに防ぎます。 null要素をチェックしていません。 toLowerCase()を1回行うことは、何度もやっているよりも効率的です。

+0

誰が新しい文字列を作成していますか? – shmosel

1

あなたが反射see javaDoc

を使用しようとすることができますしかし、私はそれが本当に必要とされるまで、それを使用するためにお勧めではないでしょう。可能であれば、フィールドのリストを持たないようにコードをリファクタリングする必要があります。

あなたはリフレクションを使用することを決定した場合、springframeworkでReflectionUtils

+0

ナタリアに感謝、私はそのように行かないことに決めました。 – Foxy

1

お客様のget(String)メソッドは本当に良いアイデアです。正しいことが必要です。ここで私はそれを行う方法は、あなたがBeanの外で行ったことに非常に似ていますが、それは良いことである懸念の分離を可能にします。

public String get(String field) { 
    switch(field.toLowerCase()) { 
     case "firstname": 
      return firstName; 
     case "lastname": 
      return lastName; 
     default: 
      throw new IllegalArgumentException(field + " is an invalid field name."); 
    } 
} 

私がいることをJava Docsノートので、ここでswitch文を使用しています:IF-THEN-ELSE Javaコンパイラは連鎖からよりもStringオブジェクトを使用するswitch文から、一般的に、より効率的なバイトコードを生成

ステートメント。

あなたBeanクラスを変更することができない場合、あなたは、少なくとも単にswitchステートメントのより良いスピードを代わりにあなたの現在のロジックであなたのループ内でこのロジックを使用する必要がありますし、equalsIgnoreCase()を複数回使用して、一度の代わりtoLowerCase()を呼び出します。

+0

あなたの答えは大変ありがとうございますが、私の場合はshmoselの答えが良いようです。再度、感謝します。 – Foxy

関連する問題