Welche der beiden Enum-Implementierungen ist besser?

  • Erste Implementierung

     public enum ReviewFlowExample {
    
        Draft {
    
            @Override
            public ReviewFlowExample getNext() {
                return Review;
            }
    
            @Override
            public ReviewFlowExample getPrevious() {
                return null;
            }
    
        },
        Review {
            @Override
            public ReviewFlowExample getNext() {
                return Final;
            }
    
            @Override
            public ReviewFlowExample getPrevious() {
                return Draft;
            }
    
        },
        Final {
            @Override
            public ReviewFlowExample getNext() {
                return null;
            }
    
            @Override
            public ReviewFlowExample getPrevious() {
                return Review;
            }
    
        };
    
        public abstract ReviewFlowExample getNext();    
    
        public abstract ReviewFlowExample getPrevious();
    
        public boolean isDraft() {
            return this.equals(Draft);
        }
    }
     

    Zweite Implementierung

     public enum ReviewFlowExample {
        Draft,
        Review,
        Final;
        private ReviewFlowExample next;
        private ReviewFlowExample previous;
    
        static{
            Draft.setNext(Review);
            Review.setNext(Final);
            Review.setPrevious(Draft);
            Final.setPrevious(Review);
        }
        private ReviewFlowExample(){
        }
    
        public ReviewFlowExample getNext(){
            return next;
        }
    
        public ReviewFlowExample getPrevious(){
            return previous;
        }
    
        private void setNext(ReviewFlowExample next){
            this.next = next;
        }
    
        private void setPrevious(ReviewFlowExample previous){
            this.previous = previous;
        }
    
        public boolean isDraft(){
            return this == Draft;
        }
    
    }
     
    26 November 2011
    Shahzeb
2 answers
  • Warum verwenden Sie nicht die Reihenfolge, die Sie in der Enum-Deklaration einrichten? Ich habe vor einiger Zeit damit gespielt und mir dabei etwas einfallen lassen (modifiziert, um Ihre Implementierung oben anzupassen):

     private enum Planet { MERCURY, VENUS, EARTH, MARS, JUPITER, SATURN, URANUS, NEPTUNE;
       public Planet getNext() {
           return this.ordinal() < Planet.values().length - 1
               ? Planet.values()[this.ordinal() + 1]
               : this;
       }
       public Planet getPrevious() {
           return this.ordinal() > 0
               ? Planet.values()[this.ordinal() - 1]
               : this;
     }
     
    06 August 2013
    Eddie Velasquez
  • Um die Diskussion etwas aufzufrischen, können Sie auch Folgendes tun:

         public ReviewFlowExample getNext() {
            ReviewFlowExample[] values = values();
            int next = ordinal() + 1 == values.length ? ordinal() : ordinal() + 1;
            return values[next];
        }
     
    24 November 2011
    Muel