Jarvis
Jarvis

Reputation: 361

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

Upvotes: 0

Views: 71

Answers (3)

Alex Salauyou
Alex Salauyou

Reputation: 14348

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

Upvotes: 1

Paul Boddington
Paul Boddington

Reputation: 37655

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.

Upvotes: 1

Peter Lawrey
Peter Lawrey

Reputation: 533820

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

Upvotes: 0

Related Questions