Imagine que tiene un menú con platos cada plato debe estar disponible en varios idiomas (Francés, Inglés, árabe, ...). La Dish
clase contiene una lista con Language
los objetos de texto.
class Dish {
List<Language> languages
void addLanguage(Language lg){...}
}
class Language { getDescription(){}}
class French extends Language{}
class Menu {List<Dish> dishes }
¿Cómo evito usar instance of
cuando se desea una descripción de un lenguaje específico para ese plato?
Debería definir para cada idioma un método get en la clase de plato: getFrench (), getArabic () ..?
O debería mantenerlo en la lista y comprobar, por ejemplo, de la francesa haciendo un bucle en la lista y luego llamar getDescription()
a este list object<language>
?
¿O hay una manera para que un enfoque más polimórfica?
No creo que sea una buena idea crear una clase separada para cada idioma. Después de todo, todas estas clases tendrán exactamente los mismos métodos.
Que haría uso de una sola Language
clase, y dentro de la Dish
clase I a mantener una Map<Locale,Description>
(me gustaría cambiar el nombre de la Language
clase a algo menos confuso como Description
, ya que no representa un idioma, que representa una descripción en un idioma).
Ahora usted puede tener una
Description getDescription(Locale locale)
método en su Dish
clase, que devolverá la descripción del plato en el lenguaje del pasado Locale
.
Usted debe preferir el uso de clases de JDK estándar como java.util.Locale
lugar de clases personalizadas cuando sea posible.
Después de considerar los comentarios, y estar de acuerdo con algunos de ellos, sugiero retirar el Map
a la Description
clase.
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);
}
}
También debe tener en cuenta que la búsqueda del lenguaje de descripción específica en una Map
es más eficiente que la búsqueda de ella en un List
( O(1)
tiempo de búsqueda en un HashMap
vs O(n)
tiempo de búsqueda en una List
).