Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我什么时候要在实际类上声明接口?_Java_Oop_Class_Interface_Declaration - Fatal编程技术网

Java 我什么时候要在实际类上声明接口?

Java 我什么时候要在实际类上声明接口?,java,oop,class,interface,declaration,Java,Oop,Class,Interface,Declaration,例如,我经常看到: Set<Integer> s = new TreeSet<Integer>(); Set<Integer> s = new HashSet<Integer>(); Map<Integer, String> m = new HashMap<Integer, String>(); Set s=new TreeSet(); Set s=新的HashSet(); Map m=新的HashMap(); 结束 T

例如,我经常看到:

Set<Integer> s = new TreeSet<Integer>();
Set<Integer> s = new HashSet<Integer>();
Map<Integer, String> m = new HashMap<Integer, String>();
Set s=new TreeSet();
Set s=新的HashSet();
Map m=新的HashMap();
结束

TreeSet ts=新树集();
HashSet hs=新的HashSet();
HashMap hm=新的HashMap();

前者与后者相比有哪些优点/缺点?

对我来说,这可以归结为几点

你关心实施吗?您的代码是否需要知道
Map
HashMap
还是
TreeMap
?或者它只是关心它有某种键/值结构吗

这还意味着,当我构建实现代码时,如果我公开了一个返回Map的方法,我可以随着时间的推移更改实现,而不会影响依赖它的任何代码(因此,尝试并强制转换这些类型的值是一个坏主意的原因)

另一个是,在代码周围移动这些结构变得更容易,因此,任何可以接受
映射的方法都比依赖
HashMap
的方法更容易处理

我遵循的约定基本上是使用满足API需求的最低功能接口。使用不提供API所需功能的接口没有意义(例如,如果需要
SortedMap
,那么使用
映射也没有意义)


对我来说,这可以归结为几点

你关心实施吗?您的代码是否需要知道
Map
HashMap
还是
TreeMap
?或者它只是关心它有某种键/值结构吗

这还意味着,当我构建实现代码时,如果我公开了一个返回Map的方法,我可以随着时间的推移更改实现,而不会影响依赖它的任何代码(因此,尝试并强制转换这些类型的值是一个坏主意的原因)

另一个是,在代码周围移动这些结构变得更容易,因此,任何可以接受
映射的方法都比依赖
HashMap
的方法更容易处理

我遵循的约定基本上是使用满足API需求的最低功能接口。使用不提供API所需功能的接口没有意义(例如,如果需要
SortedMap
,那么使用
映射也没有意义)


IMHO

通常,您希望声明具有实际使用行为的最通用类型。这样,如果您决定采用不同的具体类,就不必更改太多代码。您还可以让函数的用户更自由。

通常,您希望声明具有实际使用行为的最通用类型。这样,如果您决定采用不同的具体类,就不必更改太多代码。您可以让该功能的用户有更多的自由。

您应该阅读作者以及他的作品

基本上:如果您将Java类用作工厂之外的任何东西,即如果您在
new
操作符之后有一个类名,那么您就不是在进行面向对象编程。遵循此规则并不保证您正在执行OO,但违反此规则意味着您没有这样做

注意:不做OO没有什么错。

你应该阅读作者和他的

基本上:如果您将Java类用作工厂之外的任何东西,即如果您在
new
操作符之后有一个类名,那么您就不是在进行面向对象编程。遵循此规则并不保证您正在执行OO,但违反此规则意味着您没有这样做


注意:不使用OO没有错。

应用程序的维护成本可能是开发成本的三倍。这意味着您希望代码尽可能简单明了

如果使用列表而不是ArrayList,则需要明确说明您没有使用任何ArrayList专用的方法,并且可以从另一个列表实现中对其进行更改。当ArrayList不是必须的时候,使用它的问题是需要很长时间才能安全地确定它是否真的是一个列表。i、 很难证明你从不需要什么。(添加比删除相对容易)


一个类似的例子是在列表中使用Vector。如果你看到一个向量,你会说;开发人员选择向量有一个很好的理由,它是线程安全的。但我现在需要更改它,并检查代码是否是线程安全的。他们会说,但我看不出它是如何以多线程的方式使用的,所以我必须检查所有可能使用它的方式,或者我需要在迭代它时添加synchronized,而实际上它永远不需要线程安全。在不需要时使用线程安全集合不仅浪费CPU时间,更重要的是浪费开发人员的时间。

应用程序的维护成本可能是开发成本的三倍。这意味着您希望代码尽可能简单明了

如果使用列表而不是ArrayList,则需要明确说明您没有使用任何ArrayList专用的方法,并且可以从另一个列表实现中对其进行更改。当ArrayList不是必须的时候,使用它的问题是需要很长时间才能安全地确定它是否真的是一个列表。i、 很难证明你从不需要什么。(添加比删除相对容易)

一个类似的例子是在列表中使用Vector。如果你看到一个向量,你会说;开发人员选择向量有一个很好的理由,它是线程安全的。但我现在需要更改它,并检查代码是否是线程安全的。他们说,但我看不出它是如何以多线程的方式使用的,所以我必须检查所有的
TreeSet<Integer> ts = new TreeSet<Integer>();
HashSet<Integer> hs = new HashSet<Integer>();
HashMap<Integer, String> hm = new HashMap<Integer, String>();