将字符串中的数字与Enum进行比较

时间:2017-04-11 06:04:17

标签: java enums comparison

我正在使用枚举来定义所有常量变量。

枚举

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

建议欢迎!

2 个答案:

答案 0 :(得分:1)

您有两个选项,两个比较枚举。

  1. 使用java enum的内置compareTo方法。请参阅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 :(得分:1)

我有几点建议。如果它们不适合你,请随意丢弃。

既然你说你需要enum的序数,你可以走另一条路:

    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。你想将字符串值永久存储在枚举对象中是有问题的;如果你认真想要比较有效,你确实想要。 Jay Smith的代码使用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,这不是一回事。