2012-12-18 59 views
0

我有一個接口FeatureValue,它實現了一個名爲pretty print的函數。如何避免在地圖中轉換包裝對象?

我有兩個班,現在是實現該接口:FeatureString和FeatureList(在FeatureList的列表包含字符串)。這些類只是包裝,分別存儲一個字符串和一個列表,併爲它們的包裝值實現漂亮的打印功能。

我有EnumMap的這需要作爲鍵類型的特徵的一些枚舉(一些對應於字符串和一些對應於列表)。

我最初用這種接口,這樣我可以遍歷枚舉和漂亮的打印出來。但是現在我希望能夠從包裝器FeatureValue中獲取值。

由於我存儲枚舉映射爲<Feature, FeatureValue>,它不知道包裝的價值是什麼類型的,所以我必須當我得到它投。

有沒有一種方法來重構我的代碼,以便我不需要投射,但是仍然保留迭代Enums並在不知道類型的情況下打印它們的能力?

枚舉

public enum Features 
{ 
KIND("kind"), 
RULE("rule"), 
PROBLEM("problem"), 

private String name; 

Features(String name) 
{ 
    this.name = name; 
} 

public String getName() 
{ 
    return name; 
} 
} 

接口

public interface FeatureValue 
{ 
    public String prettyPrint(); 
} 

List實現(有一個類似的FeatureString我將省略)

public class FeatureList implements FeatureValue 
{ 
private final List<String> list; 

public FeatureList(List<String> list) 
{ 
    this.list = list; 
} 

@Override 
public String prettyPrint() 
{ 
    return Arrays.toString(list.toArray()); 
} 

public List<String> getList() 
{ 
    return list; 
} 
} 

鑄造代碼

for(String token: ((FeatureList) enumMap.get(Feature.particularFeatureThatCorrespondsToLists)).getValue()) 
    doSomething(token); 

有因爲地圖必要的強制轉換爲參數化特徵的值,而不是FeatureList

+1

我們能看到一些代碼嗎?看起來你錯過了一些東西,比如你「將枚舉地圖存儲爲」。 –

+0

是啊,我剛剛注意到,我固定的遺漏部分 – Transcendence

+0

讓我再添加一些代碼 – Transcendence

回答

0

方法getValue()添加到您的接口FeatureValue,使參數化的接口。

FeatureValue.java

public interface FeatureValue<E> { 

    String prettyPrint();  

    E getValue(); 

} 

FeatureList.java

public class FeatureList implements FeatureValue<List<String>> {  

    private final List<String> list = new ArrayList<String>(); 

    public String prettyPrint() { 
     return list.toString(); 
    } 

    public List<String> getValue() { 
     return list; 
    } 

} 

Main.java

public static void main(String[] args) { 
    for (String each: getAsList(enumMap, Features.KIND)) { 
     // do stuff 
    } 
} 

private static List<String> getAsList(
     EnumMap<Features, FeatureValue> enumMap, Features key) { 
    FeatureValue value = enumMap.get(key); 
    return value != null ? 
     ((FeatureList) value.getValue()).getValue() : Collections.EMPTY_LIST; 
} 
+0

我不是實例FeatureLists,我從包含FeatureValues地圖,這就是爲什麼我需要首先投中讓他們。 – Transcendence

+0

確實,演員仍然需要。我唯一能想到的就是創建一個方法來執行轉換,這將使代碼更清晰。恐怕鑄造永遠是必要的,因爲你的地圖存儲接口的返回值依賴於實際執行該接口。編輯我的代碼 –

0

讓您

public interface FeatureValue 
{ 
    public String prettyPrint(); 
} 

迭代,這樣

public interface FeatureValue extends Iterable<String> 
{ 
    public String prettyPrint(); 
} 

這將使任何FeatureValue是由foreach循環迭代。

對於那些實際上並不需要重複,要麼拋出一個異常

public class Stubbed1 extends FeatureValue { 
    public Iterator<String> getIterator() { 
     throw new UnsupportedOperationException(); 
    } 
} 

或返回一個空迭代

public class Stubbed2 extends FeatureValue { 
    public Iterator<String> getIterator() { 
     return Collections.<String>emptyList().iterator(); 
    } 
} 

對於類的類需要反覆做以下

public class DocumentFeatureList implements FeatureValue 
{ 
    private final List<String> list; 

    ... 

    public Iterator<String> getIterator() { 
     return list.iterator(); 
    } 
} 
相關問題