给出这个config类的代码气味是存在的,即有很多if语句。 此外,还将添加更多的类变量。 实际上,我是用一个静态工厂方法fromAttributes创建这个MailConfig对象的,它将接受一个属性列表。 现在,正如您在mapToConfig中看到的,设置mailconfig值的方式是相同的。 但是也会有一些特殊的属性需要更复杂的处理。 我如何重构它,以减少IFS的数量? 例如,接下来将有一个新的
private final String mailServer
在mapToConfig方法中添加新if时也需要这样做。。。
import lombok.Builder;
import lombok.Data;
import java.util.List;
import java.util.Objects;
@Data
@Builder
public class MailConfig {
private final String subject;
private final String mailserver;
private final String message;
public static MailConfig fromAttributes(List<Attribute> listofAttributes) {
Objects.requireNonNull(listofAttributes, "list of attributes must not be null");
MailConfigBuilder config = MailConfig.builder();
listofAttributes.stream()
.forEach(att -> mapToConfig(config, att));
return config.build();
}
private static void mapToConfig(MailConfigBuilder config, Attribute att) {
if (att.getAttribName().equalsIgnoreCase("subject")){
config.subject(att.getAttribValue());
}
if (att.getAttribName().equalsIgnoreCase("mailserver")){
config.mailserver(att.getAttribValue());
}
if (att.getAttribName().equalsIgnoreCase("message")){
config.message(att.getAttribValue());
}
}
}
您可以使用if/else,在其中一个条件为真时离开,或者使用switch case来执行同样的操作。
您必须验证attName不为null,并且attribValuei也不为null。
private static void mapToConfig(MailConfigBuilder config, String attName, String attribValue) {
switch (attName.toLowerCase()) {
case "subject":
config.subject(attribValue);
break;
case "mailserver":
config.mailserver(attribValue);
break;
case "message":
config.message(attribValue);
break;
default:
break;
}
}
只传递所需的属性,而不是整个属性对象。
你在用Java 8+吗? 如果是,你可以使用地图
class MapExample {
public static void mapper(Object o) throws Exception {
//initializing here, really should do this outside the function of course
Map<String, Runnable> routes = new HashMap<>();
//populate map
routes.put('subject', () -> config.subject(o.getAttribValue));
//and so on, for all cases
//use like this
String example = att.getAttribName();
routes.get(example).run(); // runs the method mapped to "subject" above
}
}