2011-05-25 69 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