仅仅在这个代码基础上改的话:
public HelloWords getInstance(String language) {
if (language.equals(ENGLISH.language)) {
return ENGLISH;
}
if (language.equals(MANDARIN.language)) {
return MANDARIN;
}
throw IllegalArgumentException("This language doesn't exist");
}
用 private 来定义构造方法是为了防止类的使用者通过 new 的方式来产生新的对象,在这样的方式下,类的使用者只能通过类中的 static 对象中的 getInstance 方法来获取已经存在的对象,从而减轻了内存管理的负担
不用 private 来定义变量是因为类的使用者通过 getInstance 方法只能获取类的实例,也就是对象,但是对于对象里面的内容(language、greeting)还需进一步的获取; 用 final 去定义这些变量是为了防止类的使用者更改 static 对象中的内容,因为更改后会导致内容发生全局性的改变,从而和对象本身不匹配
但是个人认为这样的设计并没有很好的体现我们之前讲的 “简单直观” 的理念,首先这里存在着很深的嵌套,就是:类 -> static 对象 -> getInstance 方法 -> static 对象 -> 变量,这么分析看来设计并不直观,对于我来说,刚开始理解还比较的困难,所以可以考虑前面的将这里的 getInstance 方法改为 static 的方法,另外就是可以设一个 getGreeting 的方法去取得 instance 中的内容,用户通过函数 API 的方式获取内部信息而不是直接获取,在这种情况下我们可以将变量设为 private,这样比较好的隐藏内部实现,当然我们也可以使用之前提到的 enum 去实现:
static enum Hellowords {
ENGLISH ("English", "Hello"),
MANDARIN ("Ni Hao");
final String language;
final String greeting;
private HelloWords(String language, String greeting) {
this.language = language;
this.greeting = greeting;
}
}
展开
作者回复: 你的留言里,有大量的深入思考,要点赞!