2

对于我在 Swing 中的图标,我有不同的枚举,例如:

    public enum Icon32 {
    STOP("resources/icons/x32/stop.ico"),
    RUN("resources/icons/x32/run.ico");
    private File path;

    private Icon32(String path) {
        this.path = new File(path);
    }

    public File getFile() {
        return path;
    }

或者

public enum Tab {
    XML("resources/icons/x32/tab/tab_1.ico"), QR("resources/icons/x32/tab/tab_2.ico"),ABOUT("resources/icons/x32/tab/tab_3.ico");
    private File path;

    private Tab(String path) {
        this.path = new File(path);
    }

    public File getFile() {
        return path;
    }

}

我创建了一个抽象实现:

public abstract class AbstractImageType {

private File path;

private AbstractImageType(String path) {
    this.path = new File(path);
}

public File getFile() {
    return path;
}

@Override
public String toString() {
    return path.toString();
}

}

但是 Enum 无法扩展:

Syntax error on token "extends", implements expected

现在我的问题是,是否可以创建一个实现方法和构造函数的通用类“AbstractImageType”?所以我只需要插入枚举值吗?

像这样的东西:

 public enum Icon32 extends AbstractImageType {
    STOP("resources/icons/x32/stop.ico"),
    RUN("resources/icons/x32/run.ico");
}
4

3 回答 3

6

Java 中的枚举不支持从类继承,因为每个enum实际上都是一个简单的扩展类Enum。由于不支持多重继承,您不能为 2 个枚举创建基类。

为此,您可以停止使用枚举,即切换到常规类或使用委托来创建文件,即接受枚举成员并返回File实例的实用程序。

于 2013-05-22T08:52:04.113 回答
5

您可以制作AbstractImageType一个接口并让您的枚举实现它。

public interface AbstractImageType {

    File getFile();
}

public enum Icon32 implements AbstractImageType  {
    STOP("resources/icons/x32/stop.ico"),
    RUN("resources/icons/x32/run.ico");
    private File path;

    private Icon32(String path) {
        this.path = new File(path);
    }

    public File getFile() {
        return path;
    }
}
于 2013-05-22T08:48:20.243 回答
4

不幸的是,不可能对枚举使用任何类型的继承,因为它会破坏Liskov Substitution Principle。Java 8 将在接口中具有默认的方法实现,但它们可能不会扩展到构造函数。

您可以做的最好的事情可能是生成代码,例如在 eclipse中使用自定义模板。

于 2013-05-22T08:53:15.173 回答