2014-02-14 118 views
1

我正在編寫一個關於醫療信息的小型項目,並在其中,我正在從幾個數據源中讀取文本。所有這些文本來源都有相同的類型的信息,但標籤略有不同。例如,sourceA有一個標題爲「不利影響」的部分,而sourceB稱其爲「副作用」。我有一個叫做Reader的接口,和幾個實現這個接口的類(AReader,BReader等)。另外,我爲每個課程的標題進行枚舉。例如:使用接口與枚舉

enum ASections { 
    SIDE_EFFECTS ("side effects"), 
    DOSAGE  ("dosage"); 
    private String sectionTitle; 
    private ASections(String s) { this.sectionTitle = s; } 
} 

enum BSections { 
    SIDE_EFFECTS ("adverse effects"), 
    DOSAGE  ("dosage and usage"); 
    private String sectionTitle; 
    private BSections(String s) { this.sectionTitle = s; } 
} 

在我的項目的核心在於一個Orchestrator類,它使用一個Reader(實際的源A,B等。由命令行選項指定)。到現在爲止還挺好。

不過,我想所有的類實現Reader,也能實現的方法getSectionText,這裏的參數應該是ASections或BSections或...

如何指定在接口級這樣的方法?

這是我第一次(顯然是錯誤的)嘗試:

public String getSectionText(Enum _section_enum); 

的想法是,沒有哪個數據源是在命令行中指定的事,我應該能夠獲得所需要的類型的文本獲取適當的部分標題。

+8

最簡單的事情可能是讓你的_enums_實現一個接口,並帶有一個getSectionText方法,該方法接受任何必要的參數。 –

+0

我不明白什麼會返回sectionText,爲什麼你傳遞一個枚舉? – nachokk

+0

@nachokk:在我的設計中,實現'Reader'接口的類有一個映射,它將節標題映射到節體中的實際文本。我想從標題的確切文本中抽象出來(因爲它們可能在多個來源中有差異,例如,「劑量」,「劑量和用法」等)。因此,該映射具有枚舉(例如'ASections.DOSAGE')作爲關鍵字,文本作爲值。然後我可以使用'Reader#getSectionText'來獲取文本。 –

回答

2

創建定義方法的接口中枚舉必須實現:

interface Sections { 
    String getSectionTitle(); 
} 

在你的枚舉,實現該接口:

enum ASections implements Sections { 
    SIDE_EFFECTS ("side effects"), 
    DOSAGE  ("dosage"); 
    private String sectionTitle; 
    private ASections(String s) { this.sectionTitle = s; } 
    public String getSectionTitle() { return sectionTitle; } 
} 

enum BSections implements Sections { 
    SIDE_EFFECTS ("adverse effects"), 
    DOSAGE  ("dosage and usage"); 
    private String sectionTitle; 
    private BSections(String s) { this.sectionTitle = s; } 
    public String getSectionTitle() { return sectionTitle; } 
} 

在你的閱讀器,該getSectionText方法接受一個Sections參數,而不是的任何特定的枚舉(代碼針對接口,而不是實現):

class Reader { 
    public String getSectionText(Sections sections) { 
     return sections.getSectionTitle(); 
    } 
} 

然後,你可以通過其中一個ASectionsBSections插入讀卡器:

public class Section8 { 
    public static void main(String[] args) { 
     Reader reader = new Reader(); 
     for (ASections asection : ASections.values()) { 
      System.out.println(reader.getSectionText(asection)); 
     } 
     for (BSections bsection : BSections.values()) { 
      System.out.println(reader.getSectionText(bsection)); 
     } 
    } 
} 

輸出:

side effects 
dosage 
adverse effects 
dosage and usage

順便說一句,有作爲的問題定義您的枚舉錯誤。構造函數是公共的,但是在Java中,枚舉的構造函數必須是私有的。

+0

更正了錯誤。感謝您指出。 –

+0

一個附加但密切相關的問題:我在每個枚舉ASections,BSections等中都有一個靜態方法。它們完全相同,但是我不能在接口中使用靜態方法。有沒有辦法在所有枚舉ASection,BSection等中泛化這種方法? –

+0

你可以簡單地將它做成實例方法嗎?爲什麼它必須是靜態的?如果這不起作用,我會建議把它作爲一個單獨的問題。 –

0

只有枚舉實現了一個接口MySection,它指定了一個方法getSectionText