如何使下面的代码更好?

时间:2016-03-19 17:35:48

标签: java

我想更好地制作以下代码,但无法获得好主意。 有什么方法可以解决这个问题吗?

我只是创建一个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);
    }
}

3 个答案:

答案 0 :(得分:1)

可以使用Class而不是==来比较

.equals个对象,因为每个类只有一个实例。

偶尔有必要使用一系列嵌套if语句来查找正确的Class对象,这显然非常难看(请参阅Arrays.deepToString的源代码真实的例子)。

还有其他解决方案涉及Map,或启用type.getSimpleName(),但即使是啰嗦,我也会亲自坚持这个简单的解决方案。

答案 1 :(得分:1)

Java 8解决方案:创建一个静态Map的“加法器方法”,其中每个可能的属性类型将与相应的lambda关联:

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

然后,对于每个field

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

答案 2 :(得分: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);