Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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_Design Patterns_Interface - Fatal编程技术网

Java 为什么编码应该是“到接口”的,特别是对于基本数据类型?

Java 为什么编码应该是“到接口”的,特别是对于基本数据类型?,java,oop,design-patterns,interface,Java,Oop,Design Patterns,Interface,我对设计方法有疑问,这就是为什么我们要将代码实现到接口。这在原始数据类型中非常常见。好像我不明白这两者之间的区别: Map<Integer, String> mymap = new HashMap<Integer, String>(); 及 这两者有什么区别吗?我的意思是,在这两种情况下,我们将使用mymap的每个地方都将保持不变 我很抱歉,如果这个问题似乎没有用,但我真的不明白这将如何有任何区别以后在哪里使用mymap。请帮忙 谢谢 注意-我已经看到了关于这样的问题

我对设计方法有疑问,这就是为什么我们要将代码实现到接口。这在原始数据类型中非常常见。好像我不明白这两者之间的区别:

Map<Integer, String> mymap = new HashMap<Integer, String>(); 

这两者有什么区别吗?我的意思是,在这两种情况下,我们将使用mymap的每个地方都将保持不变

我很抱歉,如果这个问题似乎没有用,但我真的不明白这将如何有任何区别以后在哪里使用mymap。请帮忙

谢谢


注意-我已经看到了关于这样的问题,但它并没有给出我想要的东西。

因为mymap可以在其他地方用不同的Map实现实例化,所以在使用它的代码中不应该依赖它作为HashMap的实例。

因为mymap可以在其他地方用不同的Map实现实例化,在使用它的代码中,您不应该依赖它作为HashMap的实例。

第二个选项限制您始终使用HashMap,即使有一天TreeMap可能会更有用

在第一种方法中,您可以更轻松地更改特定的实现—您只需更改一行代码。如果您从方法返回映射,它尤其可见-方法返回类型不必更改


对接口进行编码也有助于在测试期间模拟对象,但我假设这里不是这样。

第二个选项限制您始终使用HashMap,即使有一天TreeMap可能更有用

在第一种方法中,您可以更轻松地更改特定的实现—您只需更改一行代码。如果您从方法返回映射,它尤其可见-方法返回类型不必更改


对接口进行编码也有助于在测试期间模拟对象,但我假设这里不是这样。

使用Map mymap允许您稍后更改实现。例如,如果在某个时候需要对mymap进行排序,只需将初始化更改为LinkedHashMap即可

使用Map mymap可以在以后更改实现。例如,如果在某个时候需要对mymap进行排序,只需将初始化更改为LinkedHashMap即可

如果您只是在您的类型含义中使用它:private并自己实例化它,那么它并没有真正的区别


如果您的类型的公共接口公开了一个映射和一个HashMap,那么它开始变得有趣起来。

如果您只是在您的类型内部使用它,这意味着:私有并自己实例化它,那么它并没有真正的区别


如果您类型的公共接口公开了一个映射和一个HashMap,那么它开始变得有趣起来。

在您建议的特定实例中,它可能没有什么区别,但是,让自己习惯于在声明中始终使用接口是一种很好的做法,因为有些合法的实例需要这种灵活性。

在您建议的特定实例中,这可能没有什么区别,但是,让自己习惯于在声明中始终使用接口是一种很好的做法,因为有些合法的实例需要这种灵活性。

前者允许您更改为:

Map<Integer, String> mymap = new TreeMap<Integer, String>(); 
例如,在不破坏代码其余部分的情况下


一个小得多的优点是,您的IDE可以向您显示接口的方法,而不是用于实现的可能多得多的方法。

前者允许您更改为:

Map<Integer, String> mymap = new TreeMap<Integer, String>(); 
例如,在不破坏代码其余部分的情况下


一个小得多的优点是,您的IDE可以向您展示接口的方法,而不是潜在的更多的实现方法。

你链接到的另一个问题没有给出你想要的是什么?你链接的问题得到了很好的回答,但我没有得到我的答案,因为没有像我这样详细说明基元类型接口编码风格在我的问题中提到。Map不是一个基本类型。int是,boolean是,等等。你链接到的另一个问题没有给出你想要的是什么?你链接的问题得到了很好的回答,但我没有得到我的答案,因为我在问题中提到的基本类型接口编码样式没有任何规定。Map不是一个基本类型。int是,boolean是,等等。如果以后在您的私有方法中,您决定树映射是一个更好的集合,那么即使在私有方法中,对接口进行编码仍然可以保护您。IMHO这个优势更多的是理论上的,而不是实际的:大多数情况下,您只需要更改指定数据类型的字段/变量声明。根据我的经验,接口通常缺少具体类型提供的方法,导致重新实现现有功能或强制转换。永远不要

ss,为变量中的字段以及私有成员考虑正确的数据类型是一个很好的实践。@winSharp Map非常完整。除了putIfAbsent,您甚至可以毫无问题地使用ConcurrentHashMap。如果以后在您的私有方法中,您决定使用TreeMap作为更好的集合,那么即使在私有方法中,对接口进行编码也可以保护您。这一优势在理论上比实际上更重要:大多数情况下,您只需更改指定数据类型的字段/变量声明。根据我的经验,接口通常缺少具体类型提供的方法,导致重新实现现有功能或强制转换。尽管如此,为变量中的字段以及私有成员考虑正确的数据类型仍然是一个很好的实践。@winSharp Map非常完整。除了putIfAbsent,您甚至可以毫无问题地使用ConcurrentHashMap。谢谢您的回答+1的返回类型不必更改。第二个选项还将删除HashMap的所有特定功能。如果希望HashMap类型提供额外的函数,那么不应该不必要地限制该类型。旧的你可以换掉它以后的论点是愚蠢的;这仅仅意味着对映射所需功能的初始评估做得很差。出于其他原因限制返回类型也会不必要地隐藏应该在调用级别可用的功能。@nyrguds没有人反对在需要时公开该功能。这里的要点是,人们应该尽可能少地暴露,以便在以后提供灵活性。如果您需要HashMap,请继续使用HashMap,但如果您只需要一个映射,则使用它,即使实现类型恰好是HashMap。@请再次检查,这仅适用于返回类型。我看不出有什么理由在你最初的声明中提到这一点。后来的灵活性并不是一个原因;同样荒谬的是,你可以在以后的辩论中把它换掉。你想以后把它换掉吗?那么你首先做错了,应该得到额外的工作。什么样的争论是:你首先做错了,应该得到额外的工作?如果你能在几乎没有成本的情况下避免额外的工作,那你为什么不呢?谢谢你的回答+1的返回类型不必更改。第二个选项还将删除HashMap的所有特定功能。如果希望HashMap类型提供额外的函数,那么不应该不必要地限制该类型。旧的你可以换掉它以后的论点是愚蠢的;这仅仅意味着对映射所需功能的初始评估做得很差。出于其他原因限制返回类型也会不必要地隐藏应该在调用级别可用的功能。@nyrguds没有人反对在需要时公开该功能。这里的要点是,人们应该尽可能少地暴露,以便在以后提供灵活性。如果您需要HashMap,请继续使用HashMap,但如果您只需要一个映射,则使用它,即使实现类型恰好是HashMap。@请再次检查,这仅适用于返回类型。我看不出有什么理由在你最初的声明中提到这一点。后来的灵活性并不是一个原因;同样荒谬的是,你可以在以后的辩论中把它换掉。你想以后把它换掉吗?那么你首先做错了,应该得到额外的工作。什么样的争论是:你首先做错了,应该得到额外的工作?如果你能以几乎没有成本的方式避免这些额外的工作,那你为什么不呢?我找到你了,但是你能详细说明我不应该依赖它作为HashMap实例的任何情况吗?例如,如果它被创建为树映射;该示例将其显式初始化为新的HashMap。唯一能做的就是隐藏HashMap特定的功能。除非该类型来自外部源,并作为接口类型返回,否则没有理由这样做。我了解您,但您能详细说明我不应该依赖它作为HashMap实例的任何情况吗?例如,如果它创建为树映射。胡说;该示例将其显式初始化为新的HashMap。唯一能做的就是隐藏HashMap特定的功能。除非该类型来自外部源并作为接口类型返回,否则没有理由这样做。最好不要使用HashMap或ArrayList对象上可用的特定函数?这就是你所说的?最好不要使用HashMap或ArrayList对象上的特定函数?你就是这么说的?