qwe asd
qwe asd

Reputation: 1658

The way to create abstract enum

I have some enums, which has getDescription() method:

public enum Test {
    QWE ("qwe"),
    ASD ("asd"),
    ZXC ("zxc");

    private final String description;

    Test(String description) {
        this.description = description;
    }

    public String getDescription() {
        return description;
    }
}

public enum Test1 {
    RTY("rty");

    private final String description;

    Test1(String description) {
        this.description = description;
    }

    public String getDescription() {
        return description;
    }
}

Is it possible to create some abstract enum or some interface, that it could be write something like this?

public void outputDescriptions(AbstractEnumType abstractEnumType) {
    for(Enum enum: abstractEnumType.values()) {
        System.out.println(enum.getDescription());
    }
}

And output for outputDescriptions(Test)

qwe
asd
zxc

Upvotes: 3

Views: 3668

Answers (4)

jctim
jctim

Reputation: 250

First, define interface with desired method

interface DescriptionableEnum {
  String getDescription();
}

Next, add to all your enums implementation of this interafce:

enum Test implements DescriptionableEnum {...}
enum Test1 implements DescriptionableEnum {...}

And this function will help you:

public static void outputDescriptions(Class<? extends DescriptionableEnum> abstractEnumType) {
    if (abstractEnumType.isEnum()) {
        DescriptionableEnum[] values = abstractEnumType.getEnumConstants();
        for (DescriptionableEnum value : values) {
            System.out.println(value.getDescription());
        }
    }
}

Main method for testing:

public static void main(String[] args) {
    outputDescriptions(Test.class);
    outputDescriptions(Test1.class);
}

Upvotes: 2

wero
wero

Reputation: 32980

You cannot derive enums from an abstract base class but enums can implement interfaces. The following would be a solution to your problem:

You create an interface Descriptable

 public interface Descriptable {
      public String getDescription();
 }

and let all your enums implement this interface:

 public enum Test implements Descriptable {

and then write the output function like this:

public <T extends Enum<T> & Descriptable> void outputDescriptions(Class<T> tclass) {
    for(T t: tclass.getEnumConstants())
        System.out.println(t.getDescription());
}

Upvotes: 4

Vivek Singh
Vivek Singh

Reputation: 2073

No, we can't have abstract enums, all enum types extend Enum, and they're final by default. Since Java does not support multiple inheritance, an enum cannot extend anything else.

However an enum can implement Interface.

Upvotes: 0

laune
laune

Reputation: 31290

Enums can implement interfaces:

interface Descr {
    String getDescription();
}

enum Test implements Descr {
    QWE ("qwe"),
    ASD ("asd"),
    ZXC ("zxc");
    private final String description;
    Test(String description) {
        this.description = description;
    }
    public String getDescription() {
        return description;
    }
}

Upvotes: 2

Related Questions