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