あなたは各皿は、複数の言語(フランス語、英語、アラビア語、...)で利用可能であるべき料理でメニューを持っている想像してみてください。Dish
クラスが持つリストが含まLanguage
タイプのオブジェクトを。
class Dish {
List<Language> languages
void addLanguage(Language lg){...}
}
class Language { getDescription(){}}
class French extends Language{}
class Menu {List<Dish> dishes }
どのように私は使用を避けるかinstance of
、その料理のための特定の言語の記述を望むとき?
私は、各言語の皿クラスのgetメソッドのために定義する必要があります:getFrench()、getArabic()、..?
または私はそれがリストに維持し、リストをループすることによって、フランスのインスタンスをチェックしてから呼び出す必要がありgetDescription()
、この上list object<language>
?
以上の多型アプローチの方法は何ですか?
私はそれが言語ごとに別々のクラスを作成するには良いアイデアだとは思いません。結局のところ、すべてのこれらのクラスはまったく同じメソッドを持っています。
私は、単一の使用したいLanguage
クラスを、そして内部のDish
クラス私はしておこうMap<Locale,Description>
(私は名前を変更したいLanguage
以下のような混乱何かにクラスをDescription
、それは言語を表していないので、それはいくつかの言語での記述を表します)。
今、あなたは持つことができます
Description getDescription(Locale locale)
あなたのメソッドDish
渡されたの言語で料理の説明を返しますクラス、Locale
。
次のような標準のJDKクラスを使用して好む必要がありますjava.util.Locale
代わりにするときのカスタムクラスの可能性。
コメントを検討し、そのうちのいくつかに同意した後、私は削除提案Map
するDescription
クラス。
class Dish
{
Description description = new Description ();
void addDescription(Locale locale, String text)
{
description.addText(locale,text);
}
String getDescription(Locale locale)
{
return description.getText(locale);
}
}
class Description
{
Map<Locale,String> descriptions = new HashMap<>();
public void addText(Locale locale,String text)
{
descriptions.put(locale,text);
}
public void getText(Locale locale)
{
return descriptions.get(locale);
}
}
また、言語の特定の記述を検索することに注意する必要がありMap
、それを検索するよりも効率的であるList
(O(1)
ルックアップ時間HashMap
対O(n)
内のルックアップ時List
)。