猿问

枚举类如何扩展另一个外部库类?

现在我有一个现有的类,我想将其重构为一个枚举。该类当前扩展了另一个来自外部库的类。因为我仍然想从那个扩展类的一些逻辑中受益,同时我想重构。应该怎么做?

在 Java 中,一个enum类不能扩展另一个类,但它可以实现接口。还是将其重构为 Enum 的想法已经错了?让我在下面的示例代码中展示它。

假设现有类 Existing 正在扩展另一个类 Parent 并且 Parent 类来自外部库并且它不是接口。

class Existing extends Parent{

    public static final Existing A = new Existing(...);

    ....

    public static final Existing Z = new Existing(...);


    public Existing(Srting attr1, String attr1){

        super(attr1, attr2);

    }


    public Existing(String attr1){

       super(attr1);

    }

}

这个想法是让那些静态的最终字段成为枚举,例如:


enum NewDesign{

     A(attr1, attr2),

     B(attr1),

     C(attr1, attr2)

     //...;

     //constructor etc.

     //...

}

并可能在需要时添加新的额外属性,如下所示:


enum NewDesign{

  A(attr1, attr2, newAttr),

  B(attr1, newAttr),

  C(attr1, attr2, newAttr),

  //...

  //constructor etc.

  //...

}


鸿蒙传说
浏览 146回答 3
3回答

慕妹3146593

如果您需要的主要更改是创建一个枚举以摆脱静态最终字段,那么最简单的方法是创建一个不同的、带有初始化实例的枚举类型:enum ExistingEnum {    A("attr1", "attr2"),     Z("attr");    private final Existing existing;    ExistingEnum(String attr1) {        this.existing = new Existing(attr1);    }    ExistingEnum(String attr1, String attr2) {        this.existing = new Existing(attr1, attr2);    }    public Existing getExisting() {        return existing;    }}根据您Existing当前使用课程的方式,您仍然可以将其更改为枚举。Parent在下面的示例中,我在枚举上公开了一个实例,假设使用的代码Existing可以更改为调用Existing.A.getParent().parentMethod()...enum Existing {    A("attr1", "attr2"),    Z("attr");    private final Parent existing;    Existing(String attr1) {        this.existing = new ParentImpl(attr1);    }    Existing(String attr1, String attr2) {        this.existing = new ParentImpl(attr1, attr2);    }    public Parent getParent() {        return existing;    }    // only needed if logic is overridden    private static class ParentImpl extends Parent {        public static final Existing A = "";        public static final Existing Z = "";        public ParentImpl(String attr1, String attr2) {            super(attr1, attr2);        }        public ParentImpl(String attr1) {            super(attr1);        }    }}

慕村225694

我认为你可以使用组合:public class Parent {    private String attr1;    private String attr2;    public Parent(String attr1, String attr2) {        this.attr1 = attr1;        this.attr2 = attr2;    }    public void doSomething() {        // do something.    }}// compose the class Parentpublic enum NewDesign {    A("attr1", "attr2"),    B("attr1", "attr2")    ;    private Parent parent;    NewDesign(String attr1, String attr2) {        this.parent = new Parent(attr1, attr2);    }    public void func() {        parent.doSomething();    }}

森林海

因为我仍然想从那个扩展类的一些逻辑中受益,同时我想重构。继承并不是您可以从库类中编写的逻辑中获益的唯一方法。组合(Parent在 中有一个字段Existing)可能有效。现在我有一个现有的类,我想将其重构为一个枚举。为什么枚举?您的类有两个构造函数,这意味着您希望创建新实例Existing而不管已经定义的对象A......。Z这不是枚举背后的想法。并可能在需要时添加新的额外属性当出现新属性时重构所有常量可能会很乏味。您将在添加新属性后立即修改类。在我看来这不太合理,而且它有点违反了开闭原则——你并没有真正对枚举的扩展持开放态度。
随时随地看视频慕课网APP

相关分类

Java
我要回答