加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 设计模式在使用List时如何避免instanceOf

发布时间:2020-12-14 05:55:31 所属栏目:Java 来源:网络整理
导读:想象一下,你有菜单,每道菜应该有多种语言(法语,英语,阿拉伯语……). Dish类包含一个包含语言类型对象的列表. class Dish { ListLanguage languages void addLanguage(Language lg){...}}class Language { getDescription(){}}class French extends Language{
想象一下,你有菜单,每道菜应该有多种语言(法语,英语,阿拉伯语……). Dish类包含一个包含语言类型对象的列表.
class Dish { 
     List<Language> languages
     void addLanguage(Language lg){...}
}
class Language { getDescription(){}}

class French extends Language{}

class Menu {List<Dish> dishes }

如果想要对该菜肴进行特定语言的描述,我该如何避免使用?

我应该为每种语言定义一个类中的get方法:getFrench(),getArabic(),..?

或者我应该将其保留在列表中并通过循环列表检查法语的实例,然后在此列表对象上调用getDescription()< 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中搜索它更有效(HashMap中的O(1)查找时间与List中的O(n)查找时间相比).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读