Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

java enums ordering

Im using java enums to define how to render a modal window with buttons (Vaadin handles the rendering). My problem is that when I run the gui my buttons comes in a randomized order each time. So my question is this, since i use a enum set to hold my buttons, will that be unordered? whats the best way to make it into a ordered list?

My settings enum

public enum MODAL_SETTINGS {
    NEW_MODAL_WINDOW("menu.context.new", "400", MODAL_BUTTON.SAVE, MODAL_BUTTON.CANCEL),
    EDIT_MODAL_WINDOW("menu.context.modify","400", MODAL_BUTTON.UPDATE, MODAL_BUTTON.CANCEL),
    DELETE_MODAL_WINDOW("menu.context.delete", "250", false, MODAL_BUTTON.DELETE, MODAL_BUTTON.CANCEL);

    private EnumSet<MODAL_BUTTON> buttons;
    private String caption;
    private String width;
    private boolean isResizable = true;

    private MODAL_SETTINGS(String caption, String width, MODAL_BUTTON... buttons){
        this.setCaption(caption);
        this.setWidth(width);
        this.buttons = EnumSet.copyOf(Arrays.asList(buttons));
    }

    private MODAL_SETTINGS(String caption, String width, boolean isResizable, MODAL_BUTTON... buttons){
        this.setCaption(caption);
        this.setWidth(width);
        this.isResizable = isResizable;
        this.buttons = EnumSet.copyOf(Arrays.asList(buttons));
    }

    public EnumSet<MODAL_BUTTON> getButtons(){
        return buttons;
    }

    @Override
    public String toString(){
        String s = super.toString();
        s=s.replaceAll("_", ".");
        return s;
    }

    public void setCaption(String caption) {
        this.caption = caption;
    }

    public String getCaption() {
        return caption;
    }

    public void setWidth(String width) {
        this.width = width;
    }

    public String getWidth() {
        return width;
    }

    public boolean isResizable() {
        return isResizable;
    }
}

My buttons enum

public enum MODAL_BUTTON {
    SAVE, UPDATE, CANCEL, DELETE;
}
like image 202
Marthin Avatar asked May 20 '11 08:05

Marthin


Video Answer


3 Answers

Use Enum.values() instead of an EnumSet:

Note that each enum type has a static values method that returns an array containing all of the values of the enum type in the order they are declared. This method is commonly used in combination with the for-each loop to iterate over the values of an enumerated type.

Source: Enums in the Java 1.5 documentation

like image 51
Robert Munteanu Avatar answered Oct 22 '22 01:10

Robert Munteanu


According to the documentation for Enumset, the iterator should return the Enum constants in the order in which they were declared.

The iterator returned by the iterator method traverses the elements in their natural order (the order in which the enum constants are declared). The returned iterator is weakly consistent: it will never throw ConcurrentModificationException and it may or may not show the effects of any modifications to the set that occur while the iteration is in progress.

Although it can be something about with your UI thread accessing the Enums in different orders.

like image 26
Yet Another Geek Avatar answered Oct 22 '22 01:10

Yet Another Geek


From EnumSet documentation:

The iterator returned by the iteratormethod traverses the elements in their natural order (the order in which the enum constants are declared).

So, your problem is somewhere else.

like image 4
bigGuy Avatar answered Oct 22 '22 02:10

bigGuy