How can we get enum's value if string matches or get default in Java?

Advertisements

I have an enum class looking like below

@Slf4j
public enum PGPaymentStatus {

    ACTIVE(true) {
        @Override
        public <T> T accept(PaymentStatusVisitor<T> visitor) {
            return visitor.visitActive();
        }
    },
    PAID(false) {
        @Override
        public <T> T accept(PaymentStatusVisitor<T> visitor) {
            return visitor.visitPaid();
        }
    },
    EXPIRED(false) {
        @Override
        public <T> T accept(PaymentStatusVisitor<T> visitor) {
            return visitor.visitExpired();
        }
    },

    UNKNOWN(true) {
        @Override
        public <T> T accept(PaymentStatusVisitor<T> visitor) {
            return visitor.visitUnknown();
        }
    };

    public final boolean active;

    PGPaymentStatus(boolean active) {
        this.active = active;
    }

    public abstract <T> T accept(PaymentStatusVisitor<T> visitor);

    public interface PaymentStatusVisitor<T> {
        T visitActive();

        T visitPaid();

        T visitExpired();

        default T visitUnknown() {
            log.error("Unknown state received from payment gateway");
            return null;
        }
    }
}

I am trying to translate java.lang.String to PGPaymentStatus enum using valueOf method as shown below.

PGPaymentStatus.valueOf(createOrderResponse.getOrderStatus())

Is there a way to get default UNKNOWN value from valueOf method or any other alternate when order status string doesn’t match any of the enums present?

>Solution :

The first option is to prepare a method that will iterate enum values and return default if not present:

public static PGPaymentStatus iterationFindByName(String name) {
    for (PGPaymentStatus status : PGPaymentStatus.values()) {
        if (name.equals(status.name())) {
            return status;
        }
    }
    return PGPaymentStatus.UNKNOWN;
}

The more elegant way is using the Guava library Enums.getIfPresent method.

Enums.getIfPresent(PGPaymentStatus.class, name).orElse(PGPaymentStatus.UNKNOWN);

Leave a ReplyCancel reply