您可能正在寻找这样的东西:public static void main(String... args) { // do this - declare the variable to be of type Set, which is an interface Set buddies = new HashSet(); // don't do this - you declare the variable to have a fixed type HashSet buddies2 = new HashSet();}为什么第一种方法被认为是好的?稍后再说,您决定需要使用其他数据结构,例如LinkedHashSet,以便利用LinkedHashSet的功能。必须更改代码,如下所示:public static void main(String... args) { // do this - declare the variable to be of type Set, which is an interface Set buddies = new LinkedHashSet(); // <- change the constructor call // don't do this - you declare the variable to have a fixed type // this you have to change both the variable type and the constructor call // HashSet buddies2 = new HashSet(); // old version LinkedHashSet buddies2 = new LinkedHashSet(); }这看起来还不错,对吧?但是,如果您以同样的方式编写吸气剂怎么办?public HashSet getBuddies() { return buddies;}这也必须更改!public LinkedHashSet getBuddies() { return buddies;}希望您能看到,即使使用像这样的小程序,也对声明变量类型具有深远的影响。如果仅依赖于将变量声明为接口,而不是作为该接口的特定实现(在这种情况下,将其声明为接口),那么对象的来回移动无疑会大大简化程序的编写和维护。集,而不是LinkedHashSet或其他值)。可能就是这样:public Set getBuddies() { return buddies;}另一个好处是,(至少对我而言)差异有助于我更好地设计程序。但是希望我的示例可以给您一些想法...希望能有所帮助。
一天,他的老板指示一名初级程序员编写一个应用程序来分析业务数据,并将其汇总为带有指标,图形和所有其他内容的漂亮报告。老板给他一个XML文件,上面写着“这是一些示例业务数据”。程序员开始编码。几周后,他觉得度量,图形和内容足以使老板满意,于是他介绍了他的工作。老板说:“那太好了,但是它还能显示我们拥有的这个SQL数据库中的业务数据吗?”程序员回到编码。在他的整个应用程序中都有用于从XML读取业务数据的代码。他重写了所有这些代码片段,并以“ if”条件包装它们:if (dataType == "XML"){ ... read a piece of XML data ...}else{ .. query something from the SQL database ...}当看到该软件的新版本时,老板回答:“太好了,但是它还能报告来自该Web服务的业务数据吗?” 记住所有那些他必须重写的乏味的if语句,程序员变得很生气。“首先是xml,然后是SQL,现在是Web服务!真正的业务数据源是什么?”老板回答:“任何可以提供的东西”那时,程序员很受启发。