2016-03-19 28 views
0

私は以下のコードをより良くしたいと思いますが、良いアイデアは得られません。 これを解決する方法はありますか?次のコードを改善するにはどうすればよいですか?

私はAndroidプロジェクトを作成し、greenDAO greendaoを使用してクラス別に表を作成します。

for (Field field : fields) { 
    fieldName = field.getName(); 
    // we don't need this. 
    if ("serialVersionUID".equals(fieldName)) { 
     continue; 
    } 
    type = field.getType(); 
    // primary key, just auto increment. 
    if ("id".equals(fieldName)) { 
     entity.addIdProperty().autoincrement(); 
     continue; 
    } 
    // other fields 
    /* 
    * this is the problem what I want to solve. 
    * I thought it's too bad to read and have a bad looking. 
    */ 
    if (type.equals(String.class)) { 
     entity.addStringProperty(fieldName); 
    }else if (type.equals(Integer.class)) { 
     entity.addIntProperty(fieldName); 
    }else if (type.equals(Double.class)) { 
     entity.addDoubleProperty(fieldName); 
    }else if (type.equals(Float.class)) { 
     entity.addFloatProperty(fieldName); 
    }else if (type.equals(Long.class)) { 
     entity.addLongProperty(fieldName); 
    }else if (type.equals(Byte.class)) { 
     entity.addByteProperty(fieldName); 
    }else if (type.equals(Short.class)) { 
     entity.addShortProperty(fieldName); 
    }else if (type.equals(Boolean.class)) { 
     entity.addBooleanProperty(fieldName); 
    }else if (type.equals(Character.class)) { 
     entity.addStringProperty(fieldName); 
    }else if (type.equals(Date.class)) { 
     entity.addDateProperty(fieldName); 
    } 
} 
+0

スイッチ希望ここでもっとよくなり、はるかに読みやすくなります。 –

+3

@RahulSharmaクラスを切り替えることはできません。 –

+0

すべての 'static'フィールドまたは' transient'フィールドをスキップする必要があります。 –

答えて

1

のJava 8溶液:

static final Map<Class<?>, BiConsumer<Entity, String>> ADDERS = new IdentityHashMap<>(); 
{{ 
    ADDERS.put(String.class, Entity::addStringProperty); 
    ADDERS.put(Integer.class, Entity::addIntegerProperty); 
    //... 
}} 

次いで、各fieldため:各可能性タイプは、対応するラムダ関連付けられる "加算法" の静的Mapを作成

ADDERS.get(type).accept(entity, field.getName()); 
0

さらに多くの反射を使用できます。クラスごとにしかつのインスタンスが存在するため

String typeStr = type.getSimpleName(); 
switch(typeStr) { 
    case "Integer": typeStr = "Int"; break; 
    case "Character": typeStr = "String"; break; 
} 
Method m = enttity.getClass().getMethod("add" + typeStr + "Property", String.class); 
m.invoke(entity, fieldname); 
1

Classオブジェクトが==ではなく.equalsを使用して比較することができます。

(本の本​​当例えばArrays.deepToStringのソースコードを参照してください)右Classオブジェクトを見つけるために、このようなネストされたif一連の文を持つことが時折必要であり、明らかにこの非常に醜いです。

Mapを含む他の解決策がありますか、またはtype.getSimpleName()をオンに切り替えることもできますが、長時間巻き込んでも簡単に解決することができます。