Java接口作为参考类型?

时间:2018-08-06 10:28:47

标签: java variables types interface reference

我应该在哪里使用接口作为变量类型?我看到很多人都说这样做是最好的做法,但是每个示例都涉及到集合:

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流时,我从未见过有人使用接口。

5 个答案:

答案 0 :(得分:2)

这个想法是,如果不重要,您想隐藏实际的实现。通常,这会使代码更简单,并避免意外使用实现特定功能。

因此,仅将ArrayListnew一起使用。在其他任何地方都使用List。 (除非您有充分的理由)

注意:对于Java 10,您可以对局部变量使用var语法:

var list = new ArrayList<String>();

答案 1 :(得分:0)

使用接口比使用具体类更好,因为如果要切换实现,使用接口会更容易。但这仅在您有所收获的情况下适用;在5行方法中使用List而不是ArrayList不会在您的代码中改变太多。 当您接收它们作为对方法或构造函数的引用时,优点是更多,因为您使用接口/合同,并且代码的“用户”(可能是您)可以轻松地通过另一个实现来改进程序或模拟测试。

对于I / O,使用InputStreamOutpuStream是很常见的,具体类型由用户决定。这样您就可以使用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>