2017-08-02 10 views
0

ある方法でif/elseステートメントがたくさんあるメソッドを見ると、私の目には滲みが出ます。 そして何とか修正したいと思います。 方法は次の通りである:多くのif/elseをJavaで返す方法を変更するには

private Class getMapType(String header) { 
    if (header.equals(Bean01.getHeader())) { 
     return Bean01.class; 
    } else if (header.equals(Bean02.getHeader())) { 
     return Bean02.class; 
    } else if (header.equals(Bean03.getHeader())) { 
     return Bean03.class; 
    } else if (header.equals(Bean04.getHeader())) { 
     return Bean04.class; 
    } else 
     logger.log(Logger.FATAL, "File does not exist"); 
    return null; 
} 

getHeader()方法は、各クラスごとに異なります。

どうすれば再作成できますか?あなたが(それは完全修飾でなければなりません)forNameメソッドでクラス名を変更する必要が

private Class getMapType(String header) { 
    for (int i = 1; i <= 4; i++) 
     if (header.equals(Class.forName("com.mycompany.Bean0"+i).getMethod("getHeader").invoke(null))) 
      return Class.forName("com.mycompany.Bean0"+i); 

    logger.log(Logger.FATAL, "File does not exist"); 
    return null; 
} 

+1

'Bean01.getHeader()'は常に同じ 'String'を返しますか、それとも変化しますか?他のクラスと同様に?ヘッダーが変更されない場合は、 'Map >'を設定し、ヘッダーを調べることができます。 –

+0

スイッチケースを使用することができます – Amit1011

+1

strがすべてのクラス(Bean01 .. Bean04)を反復処理してからリフレクションを使用してgetHeader関数を呼び出すときに、Class.forName(str)を使用できます – ronhash

答えて

4

一つの方法は、static final Map

private static final Map<String, Class> TYPE_MAPPING = new ImmutableMap.Builder() 
    .put("Bean01", Bean01.class) 
    .put("Bean02", Bean02.class) 
    .put("Bean03", Bean03.class) 
    .build(); 

private Class getMapType(String header) { 
    return TYPE_MAPPING.get(header); 
} 
+1

あなたは10秒ほど私にそれを打ちました:D!私の+1を取る – ParkerHalo

+0

@SergheyBishyrありがとう。良い感じ。 しかし私はもっと愚かな質問があります:あなたは 'ImmutableMap.Builder()'をどこで手に入れますか?輸入ラインを指定してください。 –

+1

'import com.google.common.collect.ImmutableMap.Builder;' –

0

もう一つの方法は、反射を使用することで使用することです。

+0

Beanクラスには異なる名前があります。簡単な例のように 'Bean0 + i'のように呼びました。 –

+0

あなたはそれらを配列に保ち、クラス名の代わりに 'list.get(i)'を使うことができます。 –

+0

@HorukTarasクラス名を配列で保持し、 'for each'ループを使用します。 –

関連する問題