3 回答

TA貢獻1820條經(jīng)驗 獲得超9個贊
如果您需要的主要更改是創(chuàng)建一個枚舉以擺脫靜態(tài)最終字段,那么最簡單的方法是創(chuàng)建一個不同的、帶有初始化實例的枚舉類型:
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;
}
}
根據(jù)您Existing當前使用課程的方式,您仍然可以將其更改為枚舉。Parent在下面的示例中,我在枚舉上公開了一個實例,假設(shè)使用的代碼Existing可以更改為調(diào)用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條經(jīng)驗 獲得超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條經(jīng)驗 獲得超2個贊
因為我仍然想從那個擴展類的一些邏輯中受益,同時我想重構(gòu)。
繼承并不是您可以從庫類中編寫的邏輯中獲益的唯一方法。組合(Parent
在 中有一個字段Existing
)可能有效。
現(xiàn)在我有一個現(xiàn)有的類,我想將其重構(gòu)為一個枚舉。
為什么枚舉?您的類有兩個構(gòu)造函數(shù),這意味著您希望創(chuàng)建新實例Existing
而不管已經(jīng)定義的對象A
......。Z
這不是枚舉背后的想法。
并可能在需要時添加新的額外屬性
當出現(xiàn)新屬性時重構(gòu)所有常量可能會很乏味。您將在添加新屬性后立即修改類。在我看來這不太合理,而且它有點違反了開閉原則——你并沒有真正對枚舉的擴展持開放態(tài)度。
添加回答
舉報