我应该在哪里使用接口作为变量类型?我看到很多人都说这样做是最好的做法,但是每个示例都涉及到集合:
Invalid syntax in 'expr' parameter: Unexpected character ('d' (code 100)): expected a valid value (number, String, array, object, 'true', 'false' or 'null')\n at [column: 2]
这种做法是否主要适用于收藏? 例如,在声明I / O流时,我从未见过有人使用接口。
答案 0 :(得分:2)
这个想法是,如果不重要,您想隐藏实际的实现。通常,这会使代码更简单,并避免意外使用实现特定功能。
因此,仅将ArrayList
与new
一起使用。在其他任何地方都使用List
。 (除非您有充分的理由)
注意:对于Java 10,您可以对局部变量使用var
语法:
var list = new ArrayList<String>();
答案 1 :(得分:0)
使用接口比使用具体类更好,因为如果要切换实现,使用接口会更容易。但这仅在您有所收获的情况下适用;在5行方法中使用List而不是ArrayList不会在您的代码中改变太多。 当您接收它们作为对方法或构造函数的引用时,优点是更多,因为您使用接口/合同,并且代码的“用户”(可能是您)可以轻松地通过另一个实现来改进程序或模拟测试。
对于I / O,使用InputStream
和OutpuStream
是很常见的,具体类型由用户决定。这样您就可以使用InputStream
从网络或本地文件中进行读取。
答案 2 :(得分:0)
引用该接口是最佳实践,因为通过这种方式,您始终可以更改实际实现,而无需对该接口的调用者进行任何修改。假设您有一个像Spring这样的CDI环境。您可以将ServiceInterface
包含多种实现,但是控制器永远不会看到实际的实现。
控制器:
@Controller
public class MyController {
@Autowired
private ServiceInterface service;
/*stuff*/
}
ServiceInterface:
public interface ServiceInterface{ /*stuff*/ }
实施“ A”:
@Service
@Profile("A")
@Primary
public class ServiceImplementationA implements ServiceInterface {
/*stuff*/
}
实施“ B”:
@Service
@Profile("B")
public class ServiceImplementationB implements ServiceInterface {
/*stuff*/
}
Spring有自己的机制来选择实现(称为配置文件),但是替代方法也像工厂一样存在。只要接口不变,就可以在两个服务实现之间切换:控制器类不会检测到任何变化。
答案 3 :(得分:0)
这是一种远见。是的,有一条规则,
始终使用代码进行交互。
但是为什么?
对于定义类型,请使用new ArrayList<>()
;对于声明性类型,请使用List<String>
。这是一个好习惯。现在,让我们考虑一下,通常ArrayList
的随机数性能确实适合您的数据和程序。如果存在新的容器类型,例如称为NicePerformedList
的方法,它也实现了List
接口,并且在5年后使您的程序性能更好,您是否将重构所有声明式类型来代替仅更改定义类型?
答案 4 :(得分:0)
当不同的类之间有不同的方法实现时,最佳实践是使具有该方法签名的接口并在类中实现它们。因此,无论使用哪种实现,我们都可以将接口用作变量,也可以将其作为内部变量传递给其他方法。
<path>