Java 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-else语句

有人能帮我简化并减少代码行数吗

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