2017-04-11 32 views
0

我使用枚舉來定義所有常量變量。使用枚舉比較字符串中的數字

枚舉

public enum ApplicationStatus { 
     Initiated(1), PendingVerification(2), NotEligible(3), Approved(4), SoftDenial(
       5), Deferred(6), Saved(7), Cancelled(8), Approved_NoSSN(9), PendingVerification_NoSSN(
       10), Approved_Archived(11); 

     private final int value; 

     private ApplicationStatus(int value) { 
      this.value = value; 
     } 

     public int getStatusMasterId() { 
      return value; 
     } 
    }; 

,我需要比較兩個整數值。什麼是比較以下整數的有效方法?

比較整數: -

public void applicationStatus(){ 
    String applicationStatus = null; 
    String statusMasterId = "2"; 
    if(ApplicationStatus.PendingVerification.ordinal() == Integer.parseInt(statusMasterId)){ 
     applicationStatus = "Pending Verification"; 
    } 
} 

建議表示歡迎!

+0

可能是'switch case' – XtremeBaumer

+1

難道你不想使用'getStatusMasterId'而不是'ordinal'嗎?我還會考慮在'ApplicationStatus'中有一個方法,它可以接受'int'值並返回'ApplicationStatus',但這只是我 – MadProgrammer

+0

你想完成什麼? – ajb

回答

1

我有幾個建議。如果他們不適合你,隨時放棄。

既然你說你需要枚舉的序數,你可以走另一條路:

if (ApplicationStatus.values()[Integer.parseInt(statusMasterId)] == ApplicationStatus.PendingVerification) { 
     // do your stuff 
    } 

要知道,在這個問題Integer.parseInt(statusMasterId)可能拋出NumberFormatException

另一項建議,由傑伊·史密斯的回答比較方法,可以再往前走一步,接受一個字符串參數:

public enum ApplicationStatus { 
    Initiated(1), PendingVerification(2), NotEligible(3), Approved(4), 
    SoftDenial(5), Deferred(6), Saved(7), Cancelled(8), 
    Approved_NoSSN(9),PendingVerification_NoSSN(10), 
    Approved_Archeived(11); 

    private final int value; 
    // redundant representation of ordinal() as a string for comparison to other strings 
    private final String ordinalAsString; 

    private ApplicationStatus(int value) { 
     this.value = value; 
     ordinalAsString = String.valueOf(ordinal()); 
    } 

    public int getStatusMasterId() { 
     return value; 
    } 

    public boolean compare(String stringValue) { 
     return this.ordinalAsString.equals(stringValue); 
    } 
} 

沒有一個NumberFormatException的風險,但你可能會考慮風險,甚至有更糟糕的是:這不會識別例如"+2""02"表示數字2.是否要將字符串值永久存儲在枚舉對象中是有問題的;如果你真的想要比較高效,你確實想要。傑伊史密斯的代碼是使用value,我已將其更改爲使用ordinal()

這裏是測試!

String statusMasterId = "2"; 
    if (ApplicationStatus.values()[Integer.parseInt(statusMasterId)] == ApplicationStatus.NotEligible) { 
     System.out.println("Not eligible"); 
    } 
    if (ApplicationStatus.NotEligible.compare(statusMasterId)) { 
     System.out.println("Still not eligible using the compare() method"); 
    } 

這將打印

Not eligible 
Still not eligible using the compare() method 

這是因爲從序號0開始,所以NotEligible,具有值爲3,具有順序2,它是不一樣的事情。

+0

我這樣打電話,但它返回false - 如果(ApplicationStatus.Initiated.compare(statusMasterId)){0};}};}}}} \t \t \t System.out.println(applicationStatus); \t \t} – Aishu

+0

您是否測試了compare()代碼...它返回false – Aishu

+0

V.V - 這工作正常......但我試圖在我的if條件中使用compare()。這是返回false.And這是我的關注 – Aishu

1

你有兩個選擇兩個比較枚舉。

  1. 使用內置的compareTo java enum的方法。請參閱https://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html#compareTo(E)
  2. 在枚舉中創建您自己的比較方法。像:

    public enum ApplicationStatus { 
        Initiated(1), PendingVerification(2), NotEligible(3), Approved(4), 
        SoftDenial(5), Deferred(6), Saved(7), Cancelled(8), 
        Approved_NoSSN(9),PendingVerification_NoSSN(10), 
        Approved_Archeived(11); 
    
        private final int value; 
    
        private ApplicationStatus(int value) { 
         this.value = value; 
        } 
    
        public int getStatusMasterId() { 
         return value; 
        } 
        public boolean compare(int value) { 
         return this.value==value; 
        } 
    }; 
    
+1

非常好的信息。我想你一直在跳過關於字符串中的一個數字的部分。也許提問者可以爲自己調整。 –