Java if-else语句的代码清理
这是代码的和平,我希望它更有效 我看到很多if-else语句 有人能帮我简化并减少代码行数吗Java if-else语句的代码清理,java,performance,Java,Performance,这是代码的和平,我希望它更有效 我看到很多if-else语句 有人能帮我简化并减少代码行数吗 if(mmPageCounter.equalsIgnoreCase("trueNotFull")){ if(whatPageNext.equalsIgnoreCase("first")) accountListSize = 5; else accountListSize = acctIdList.size(); }else if(mmPageCounter
if(mmPageCounter.equalsIgnoreCase("trueNotFull")){
if(whatPageNext.equalsIgnoreCase("first"))
accountListSize = 5;
else
accountListSize = acctIdList.size();
}else if(mmPageCounter.equalsIgnoreCase("true")){
if(whatPageNext.equalsIgnoreCase("first"))
accountListSize = 5;
else
accountListSize = 10;
}else if(mmPageCounter.equalsIgnoreCase("false")){
if(whatPageNext.equalsIgnoreCase("alwaysFirst"))
accountListSize = acctIdList.size();
}
在上面的代码中,基于mmPageCounter的值我正在设置
将For循环的索引设置为满容量或实际值
满容量意味着,for循环将只迭代10项
ps:我已经让代码正常工作了,而且很好,但我只想进行微调
如果任何人有任何微调技巧,请分享链接。我会反过来写。 何时应将帐户大小设置为10? 何时应将帐户大小设置为5
if(shouldBeFive()){
accountListSize = 5;
} else if (shouldBeTen()){
accountListSize = 10;
} else{
accountListSize = acctIdList.size()
}
此外,您还可以在java7中切换大小写。这并不会使其更快,但会减少代码,您可以替换为:
if(whatPageNext.equalsIgnoreCase("first"))
accountListSize = 5;
else
accountListSize = 10;
作者:
以及:
作者:
更新:
如果mmPageCounter只能是“trueNotNull”、“true”或“false”,那么我认为这段代码是等效的:
int maxsize = mmPageCounter.equalsIgnoreCase("true") ? 10 : acctIdList.size();
if(mmPageCounter.equalsIgnoreCase("false")){
if(whatPageNext.equalsIgnoreCase("alwaysFirst"))
accountListSize = accountListSize = acctIdList.size();
} else {
accountListSize = whatPageNext.equalsIgnoreCase("first") ? 5 : maxsize
}
但是您应该针对当前代码编写测试,并检查此代码在边缘情况下的行为是否完全相同。如果您事先知道
mmPageCounter
和whatPageNext
的所有可能值,您可以使用HashMap
初始化期间:
accountListSizes = new HashMap<String, Integer>();
accountListSizes.put("trueNotFull|first", 5);
accountListSizes.put("true|first", 5);
...
此实现比您的实现慢一点,但更易于阅读和扩展。您甚至可以在运行时更改映射。我的建议不是缩短代码,而是使代码更易于扩展和维护。然而,它将使客户机代码大大缩短 我会选择一个
enum
,但不使用switch语句,因为我可以在这里找到一个策略,我更喜欢将逻辑封装在客户端之外。此外,我还提供了一个抽象(接口),它允许我或其他人将来使用替代实现,而无需向枚举添加新常量。我将字符串和数字的文字值定义为常量(在抽象中,如果有意义的话)
以下是“战略”抽象:
interface PageCounter {
String FIRST = "first";
String ALWAYS_FIRST = "alwaysFirst";
int FIRST_SIZE = 5;
int DEFAULT_SIZE = 10;
int getAccountListSize(String whatPageNext, List<?> acctIdList);
}
这是您的代码(在客户端要短得多,并且不知道现有的可能性)
计数器
可以通过一些工厂方法提供,这样您就可以切换子类的页面计数器
实现(这就是我选择使用接口的原因),但我不想让它变得比现在更复杂。也许可以使用switch语句?(如果应该在;)之间,则将其设置为10)字符串和int常量应该是静态的,并且final@teodozjan:它们是(它们在接口中声明)。说:“接口主体中的每个字段声明都是隐式公共、静态和最终的。允许为此类字段冗余指定任何或所有这些修饰符。”没错,我习惯于以I字母开头接口名称(这就是为什么我认为它是类)。我的错误。
int maxsize = mmPageCounter.equalsIgnoreCase("true") ? 10 : acctIdList.size();
if(mmPageCounter.equalsIgnoreCase("false")){
if(whatPageNext.equalsIgnoreCase("alwaysFirst"))
accountListSize = accountListSize = acctIdList.size();
} else {
accountListSize = whatPageNext.equalsIgnoreCase("first") ? 5 : maxsize
}
accountListSizes = new HashMap<String, Integer>();
accountListSizes.put("trueNotFull|first", 5);
accountListSizes.put("true|first", 5);
...
String key = String.format("%s|%s", mmPageCounter, whatPageNext);
Integer value = accountListSizes.get(key);
if (value == null) {
accountListSize = acctIdList.size();
} else {
accountListSize = value;
}
interface PageCounter {
String FIRST = "first";
String ALWAYS_FIRST = "alwaysFirst";
int FIRST_SIZE = 5;
int DEFAULT_SIZE = 10;
int getAccountListSize(String whatPageNext, List<?> acctIdList);
}
enum DefaultPageCounter implements PageCounter {
TRUENOTFULL {
@Override
public int getAccountListSize(String whatPageNext, List<?> acctIdList) {
return FIRST.equalsIgnoreCase(whatPageNext) ? FIRST_SIZE : acctIdList.size();
}
},
TRUE {
@Override
public int getAccountListSize(String whatPageNext, List<?> acctIdList) {
return FIRST.equalsIgnoreCase(whatPageNext) ? FIRST_SIZE : DEFAULT_SIZE;
}
},
FALSE {
@Override
public int getAccountListSize(String whatPageNext, List<?> acctIdList) {
// some default (non)value is required here: -1 can be whatever.
return ALWAYS_FIRST.equalsIgnoreCase(whatPageNext) ? acctIdList.size() : -1;
}
};
}
PageCounter counter = DefaultPageCounter.valueOf(mmPageCounter.toUpperCase());
int accountListSize = counter.getAccountListSize(whatPageNext, acctIdList);