2016-04-21 54 views
0

我在我的應用程序枚舉類和我使用這個枚舉比較喜歡這個BigIntegers的值:的Java枚舉爲BigInteger的值

if (user.getObjId.equals(RoleEnum.ADMIN.getValue())) { 
    //something happens 
} 

的問題是,我可以修改此枚舉類使用它,而不調用getValue()方法,如下面的代碼示例所示?

if (user.getObjId.equals(RoleEnum.ADMIN)) { 
    //something happens 
} 

這裏是我的枚舉類:

public enum RoleEnum { 
    ADMIN(1), USER(2); 
    private final BigInteger value; 

    private RoleEnum(int value) { 
     this.value = BigInteger.valueOf(value); 
    } 

    public BigInteger getValue() { 
     return value; 
    } 
} 

回答

1

BigInteger的背後的想法是,你可以用都這麼大了,你可以只在IDE中鍵入數字路數工作...

你應該做的:

ADMIN("1"), USER("2"); 
private RoleEnum(String value) { 
    this.value = BigInteger.valueOf(value); 
1

回答你的問題很簡單 '否'。

這一切都取決於objectId的equals方法。你不能覆蓋枚舉的equals方法,但你可以用覆蓋/聲明objectId上的equals方法(很難從你提供的信息中說出)。

然後,equals方法的實現可以檢查參數的類型是枚舉類型,在這種情況下,比較這些值。例如:

public boolean equals(Object o){ 
    if(o instanceof RoleEnum){ 
     return this.value.equals(((RoleEnum)o).getValue()); 
    } 
    ... 
} 

但我認爲,你的objId是BigInteger類型,所以你不能重寫equals方法。在這種情況下,答案是提上面:「否」

+2

您可以覆蓋平等,但你不能這樣做沒有打破平等的合同這是一個壞主意屬性,例如對稱:如果'a.equals(b)'然後'b.equals(a)'。 – weston

+0

感謝您指出這一點! –

1

如果這樣看起來整齊試(特別是如果它在一個以上的地方發生)的東西不是很整齊重構了一個方法:

if (user.isRole(RoleEnum.ADMIN)) 

User(我假設的user類型的名稱):

public boolean isRole(RoleEnum role) { 
    return getObjId.equals(role.getValue()); 
} 

或者,如果它不是不可能修改User或從那裏引用枚舉,那麼也許一個靜態:

public final class UserHelpers { 

    private UserHelpers(){} 

    public static boolean userIsRole(User user, RoleEnum role) { 
     return user.getObjId.equals(role.getValue()); 
    } 
} 

用法:

if (UserHelpers.userIsRole(user, RoleEnum.ADMIN)) 

或者與static進口:

if (userIsRole(user, RoleEnum.ADMIN))