2016-02-10 2 views
2

У меня есть некоторая структура данных, которая требует алфавита в качестве параметра его конструктора. Поэтому, если я создам новый экземпляр, мне нужно будет каждый раз снабжать алфавит.Проблема утилиты утилиты Java

Есть ли более простой способ? Я думаю, что я могу symplify его использования статической полезности класса, как этот

Alphabet { 
    public static final eng = "abc...z"; 
    public static final ua = "абв...я"; 
} 

Но это не гарантирует расширяемость. Я имею в виду, да, я могу просто добавить некоторые алфавиты к такому классу, но пользователь не может добавить свои собственные алфавиты, для изучения русского алфавита.

я могу сделать вспомогательный класс, который использует частный экземпляр HashMap, где K является Coutry-код и V является алфавит, а также поддержка получить/ставить методы для пользователя. Таким образом, я могу гарантировать расширяемость. Но разве это не делает все сложным?

Редактировать

Предположим, в настоящее время я делаю так

Structure instance = new Structure("abc...z"); 
//in another class 
Structure instance = new Structure("abc...z"); 

По полезности класса я могу сделать так

Structure instance = new Structure(Alphabet.eng); 
//in another class 
Structure instance = new Structure(Alphabet.eng); 
+1

Вы также можете использовать файл свойств и прочитать его на карте – Musaddique

+0

@TipuSultan, но трудно ли пользователю понять, почему я использую такой класс и на самом деле его использую? –

+0

Как используется алфавит? Почему пользователю нужно добавить новый алфавит? По словам пользователя, вы имеете в виду разработчика? –

ответ

3

Это звучит для меня, как вы должны иметь интерфейс. Предоставьте несколько собственных реализаций (возможно, перечисление), в то время как другой разработчик может создать собственную реализацию. Метод, который использует этот алфавит, должен принять интерфейс (а не перечисление).

interface Alphabet { 
    String characters(); 
} 

enum KnownAlphabet implements Alphabet { 
    ENG("abc...z"), 
    UA("абв...я"); 

    private final String characters; 

    KnownAlphabet(String characters) { 
     this.characters = characters; 
    } 

    @Override 
    public String characters() { 
     return characters; 
    } 
} 

class Structure { 
    public Structure(Alphabet alphabet) { 
     String characters = alphabet.characters(); 
     // do whatever you were doing with the characters before 
    } 
} 

Тогда ваш:

Structure instance = new Structure(Alphabet.eng); 

Изменения в:

Structure instance = new Structure(KnownAlphabet.ENG); 

Это то, что вы ищете?

+0

Хм, это один из возможных подходов, да, он делает то, что я хочу, но с некоторой сложностью (+1 кстати) –

+0

, и этот подход лучше, а затем использование HashMap с кодами стран –

+1

Имея программу, которую можно легко расширить другими разработчиками никогда не приходит бесплатно;) Кроме того, этот подход предлагает более качественную статическую типизацию - ваш метод не принимает никаких «String», он принимает очень конкретные строки, поэтому теперь это можно документировать в интерфейсе. –

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