如何处理java中使用同一对象的多个if语句和案例?
我有一个问题,当使用在逻辑中使用相同对象的多个if语句时,如何对代码进行最佳排序 我在表中自定义列值,根据列ID,将应用不同的逻辑来提取特定列的值 假设我有三个不同的列,分别命名为“Column 1”、“Column 2”和“Column 3”,其中“Column 1”和“Column 3”在其逻辑中都使用称为obj的自定义对象,而“Column 2”则不使用 排列if语句的最佳方法是什么?我应该在哪里创建对象?我添加了三个不同的案例,哪一个是最好的,为什么?另一个更好的独奏曲 提前谢谢如何处理java中使用同一对象的多个if语句和案例?,java,if-statement,design-patterns,logic,Java,If Statement,Design Patterns,Logic,我有一个问题,当使用在逻辑中使用相同对象的多个if语句时,如何对代码进行最佳排序 我在表中自定义列值,根据列ID,将应用不同的逻辑来提取特定列的值 假设我有三个不同的列,分别命名为“Column 1”、“Column 2”和“Column 3”,其中“Column 1”和“Column 3”在其逻辑中都使用称为obj的自定义对象,而“Column 2”则不使用 排列if语句的最佳方法是什么?我应该在哪里创建对象?我添加了三个不同的案例,哪一个是最好的,为什么?另一个更好的独奏曲 提前谢谢 //
// Case 1
public Object getColumnValue(String columndId) {
if (columndId.equals("Column 1") || columndId.equals("Column 3")) {
customObject obj = new customObject();
if (columndId.equals("Column 1")) {
// do something with the custom object
} else if (columndId.equals("Column 3") ||) {
// do something else with the custom object
}
} else if (columndId.equals("Column 2")) {
// do something without the custom object
} else {
return null;
}
}
// Case 2
public Object getColumnValue(String columndId) {
customObject obj = new customObject();
if (columndId.equals("Column 1") {
// do something with the custom object
} else if (columndId.equals("Column 2")) {
// // do something without the custom object
} else if (columndId.equals("Column 3")) {
/// do something with the custom object
} else {
return null;
}
}
// Case 3
public Object getColumnValue(String columndId) {
if (columndId.equals("Column 1") {
customObject obj = new customObject();
// do something with the custom object
} else if (columndId.equals("Column 2")) {
// // do something without the custom object
} else if (columndId.equals("Column 3")) {
customObject obj = new customObject();
/// do something with the custom object
} else {
return null;
}
}
// Case 4
public Object getColumnValue(String columndId) {
switch (columnId) {
case "Column 1":
case "Column 3":
customObject obj = new customObject();
switch (columnId) {
case "Column 1":
// do somethingt with custom object
case "Column 3":
// do something else with custom object
}
case "Column 2":
// do something without custom object
}
}
我认为战略设计模式是最好的选择。每个定制都有一个这样的专用类(更好的名称是MyCustomizationStrategy):
你听说过switch案例陈述吗?不管怎样,这都是一个代码审查question@Stultuske不过,代码审查网站不会接受它,因为代码是假设性的,永远不会被接受。@Stultuske是的,我接受了,那么你是说在创建对象之前,在多个情况下应该使用该对象,然后呢?每种情况都意味着以不同的方式处理对象。就像我刚才添加的案例4一样。@marcusystad避免if/else(或多个if)涉及检查拥有方法
getColumnValue()
的类的设计。设计模式策略可以帮助替换多个if。`对于案例4,您可以在私有方法中提取第二个开关
,以避免开关
nesting@Cedric不幸的是,我无法更改拥有方法getColumnValue()的类
因为它是软件代码库的一部分,我不允许更改。我应该如何考虑何时创建对象以及如何以最佳方式嵌套类似的ifs?
public abstract class CustomizationStrategy {
protected abstract String getSupportedColumnId();
public boolean isApplicable(String columnId) {
return getSupportedColumnId().equals(columnId);
}
public abstract Object customizeColumnValue(String columnId);
}
public class MyCustomizationStrategy extends CustomizationStrategy {
private final static String SUPPORTED_COLUMN_ID = "Column X";
@Override
protected List<String> getSupportedColumnId() {
return SUPPORTED_COLUMN_ID;
}
public Object customizeColumnValue(String columnId) {
return ...
}
}
private static final List<CustomizationStrategy> CUSTOMIZATION_STRATEGIES =
Arrays.asList(new MyCustomizationStrategy(), ...);
public Object getColumnValue(String columndId) {
return CUSTOMIZATION_STRATEGIES.stream()
.filter(strategy -> strategy.isApplicable(columnId))
.map(strategy -> strategy.customizeColumnValue(columnId))
.findFirst()
.orElse(null);
}