简体   繁体   中英

how can I make the following code better?

I want to make the following code better, but cannot get a good idea. Is there any way to solve this?

I just create a Android project and use greenDAO greendao to create tables by Class.

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);
    }
}

Class objects can be compared using == rather than .equals because there is only ever one instance per class.

It is occasionally necessary to have a sequence of nested if statements like this to find the right Class object, and this obviously very ugly (see the source code for Arrays.deepToString for a real example of this).

There are other solutions involving Map , or switching on type.getSimpleName() , however I would personally stick to the simple solution even if it is long-winded.

Java 8 solution: create a static Map of "adder methods" where each possible property type will be associated with corresponding lambda:

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

then, for each field :

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

You could use more reflection.

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);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM