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);