Java enums + template method design pattern

Let’s consider the following code snippets:

public enum Currency { 
  EUR, USD
}

 

String currency = "EUR";

if(Currency.EUR.name().equals(currency)){ 
  System.out.println("Transfer permitted");
}

How often do we see much the same scenario? It is not completely wrong since there is a try to use enums so it is not entirely “string driven” programming. However there is still a space to do some refactoring.

What about doing such stuff more in the object-oriented way? Enums are very powerful Java feature but for most of the cases there are only used in the simplest possible way.

public enum Currency {
  EUR() {
    @Override 
      public boolean isTransferPermitted() {
        return true;
      }
  }, 
  USD() {
    @Override 
    public boolean isTransferPermitted() {
      return false;
    }
  };
    
  public abstract boolean isTransferPermitted();
}

 

Currency currency = Currency.valueOf("EUR");

if(currency.isTransferPermitted()){  
  System.out.println("Transfer permitted");
}

In my opinion, refactored code is clearer and more self-documenting then the original one. Generally speaking it is a Template Method design pattern applied to Java enums.