2011-05-25 65 views
0

这里是代码的和平,这我期待使其更有效率 我看到很多如果else语句代码清理了,如果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循环设置要么全capactiy,或与实际值的值

全容量意味着,for循环将迭代只有10个项目

PS:我已经得到了代码工作,并以其优良的,但我的微调

只想找如果任何一个人有任何罚款调音提示请分享链接。

+2

使用枚举和switchcase – 2011-05-25 08:27:36

+0

可能会使用switch语句吗? – Treemonkey 2011-05-25 08:28:35

回答

1

这并不能使它更快,但减少了代码,可以替代:

if(whatPageNext.equalsIgnoreCase("first")) 
    accountListSize = 5; 
else 
    accountListSize = 10; 

由:

accountListSize = whatPageNext.equalsIgnoreCase("first") ? 5 : 10; 

和:

if(whatPageNext.equalsIgnoreCase("first")) 
    accountListSize = 5; 
else 
    accountListSize = acctIdList.size(); 

由:

accountListSize = whatPageNext.equalsIgnoreCase("first") ? 5 : acctIdList.size(); 

UPDATE:

如果mmPageCounter只能是“trueNotNull”,“真”或“假”,那么我认为这个代码是等价的:

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 
} 

但你应该编写针对当前的代码和检查测试该代码在边缘案例中的行为完全相同。

+0

这将使代码紧凑 – gmhk 2011-05-25 08:49:49

1

我会反写它。 账户大小应该设置为10? 当帐户大小应设为5?

if(shouldBeFive()){ 
    accountListSize = 5; 
} else if (shouldBeTen()){ 
    accountListSize = 10; 
} else{ 
    accountListSize = acctIdList.size() 
} 

你也可以在java7中切换大小写。

+1

(把它设置为'if shouldBeTen';)) – 2011-05-25 08:45:32

+0

常见错误,修复 – teodozjan 2011-05-25 09:36:07

0

如果您事先知道mmPageCounterwhatPageNext的所有可能值,则可以使用HashMap

在初始化过程中:

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

此实现比你慢一点点,但它更容易阅读和扩展。即使在运行时您也可以更改映射。

0

我的建议并不是让你的代码更短,但更具扩展性,更易于维护。但是,它会使客户端代码缩短很多

我会选择一个enum但没有switch语句,因为我可以在这里发现一个策略,我宁愿将逻辑封装在客户端之外。另外,我会提供一个抽象(一个接口),使我或其他人能够在将来使用替代实现,而不需要为enum添加新的常量。为您的字符串和数字我会定义为常数(在抽象,如果是有道理的)字面值

这里的“战略”的抽象:

interface PageCounter { 
    String FIRST = "first"; 
    String ALWAYS_FIRST = "alwaysFirst"; 

    int FIRST_SIZE = 5; 
    int DEFAULT_SIZE = 10; 

    int getAccountListSize(String whatPageNext, List<?> acctIdList); 
} 

这里的enum实现PageCounter接口和提供默认的实现:

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

可以通过一些工厂方法来提供,这样就可以切换PageCounter实现子类(这就是为什么我选择使用后,所有的接口),但我不想让这个比它更复杂的counter已经是。

+0

字符串和int常量应该是静态的并且是最终的 – teodozjan 2011-05-27 10:14:10

+0

@teodozjan:它们是(它们是在接口中声明的) 。 http://java.sun.com/docs/books/jls/second_edition/html/interfaces.doc.html表示:“接口主体中的每个字段声明都是隐式的public,static和final。为这些字段冗余地指定任何或所有这些修饰符。“ – 2011-05-27 12:29:53

+0

你说得对,我习惯用I字母开始接口名称(这就是为什么我认为它是类)。我的错。 – teodozjan 2011-05-27 13:25:47