Какой из двух реализации enum-это лучше?


Первая Реализация

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

Второе Исполнение

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

}


397
5
задан 24 ноября 2011 в 03:11 Источник Поделиться
Комментарии
3 ответа

Почему бы не использовать того, вы настраиваете в перечислимом объявлении? Я играл с этим некоторое время назад и придумал что-то вроде этого (изменен, чтобы соответствовать вашим выше реализации):

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

5
ответ дан 24 ноября 2011 в 04:11 Источник Поделиться

Просто чтобы оживить дискуссию, вы могли бы также сделать что-то вроде этого:

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

2
ответ дан 24 ноября 2011 в 04:11 Источник Поделиться

Хотя другие ответы верны, их читабельность страдает и они работают только для линейных процессов (и мне не нравятся решения, которые опираются на декларацию). Я бы для удобочитаемости, что лучше во втором. Но это может быть сокращения:

public enum ReviewFlowExample {
Draft,
Review,
Final;

private ReviewFlowExample next = null;
private ReviewFlowExample previous = null;

static{
Draft.next = Review;

Review.previous = Draft;
Review.next = Final;

Final.previous = Review;
}

public ReviewFlowExample getNext(){
return next;
}

public ReviewFlowExample getPrevious(){
return previous;
}

public boolean isDraft(){
return this == Draft;
}
}


Петр предложил вместо этого использовать государственную машину. Я думаю, что первое решение-это уже государственная машина, нет необходимости добавить дополнительные интерфейсы. Вы просто должны перейти по вашей логике рабочего процесса в перечисление. Но трудно сказать, если государственная машина стоит, не зная другого кода.

0
ответ дан 6 августа 2013 в 08:08 Источник Поделиться