2014-02-14 3 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, почему вы передаете enum? – 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; } 
} 

В вашем Reader, метод getSectionText принимает параметр Sections вместо любого конкретного перечисления (код против интерфейса, а не реализация):

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

Затем вы можете передать либо ASections или BSections в считывающее:

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 и т. Д. Они делают то же самое, но я не могу иметь статический метод в интерфейсе. Есть ли способ обобщить этот метод на всех enums ASection, BSection и т. Д.? –

+0

Можете ли вы просто сделать это методом экземпляра? Почему он должен быть статичным? Если это не сработает, я бы предложил задать его как отдельный вопрос. –

0

только что enum реализует интерфейс, MySection, который определяет один метод getSectionText.

Смежные вопросы