我想更好地制作以下代码,但无法获得好主意。 有什么方法可以解决这个问题吗?
我只是创建一个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 :(得分: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);