为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

鸿蒙传说 2023-04-19 15:38:32
现在我有一个现有的类,我想将其重构为一个枚举。该类当前扩展了另一个来自外部库的类。因为我仍然想从那个扩展类的一些逻辑中受益,同时我想重构。应该怎么做?在 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.  //...}
查看完整描述

3 回答

?
慕妹3146593

TA贡献1820条经验 获得超9个赞

如果您需要的主要更改是创建一个枚举以摆脱静态最终字段,那么最简单的方法是创建一个不同的、带有初始化实例的枚举类型:


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

        }

    }

}


查看完整回答
反对 回复 2023-04-19
?
慕村225694

TA贡献1880条经验 获得超4个赞

我认为你可以使用组合:


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 Parent

public 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();

    }

}


查看完整回答
反对 回复 2023-04-19
?
森林海

TA贡献2011条经验 获得超2个赞

因为我仍然想从那个扩展类的一些逻辑中受益,同时我想重构。

继承并不是您可以从库类中编写的逻辑中获益的唯一方法。组合(Parent在 中有一个字段Existing)可能有效。

现在我有一个现有的类,我想将其重构为一个枚举。

为什么枚举?您的类有两个构造函数,这意味着您希望创建新实例Existing而不管已经定义的对象A......。Z这不是枚举背后的想法。

并可能在需要时添加新的额外属性

当出现新属性时重构所有常量可能会很乏味。您将在添加新属性后立即修改类。在我看来这不太合理,而且它有点违反了开闭原则——你并没有真正对枚举的扩展持开放态度。


查看完整回答
反对 回复 2023-04-19
  • 3 回答
  • 0 关注
  • 145 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信