立即降级有什么好处?

Bob*_*Bob 6 java coding-style

我最近一直在寻找很多代码(为了我自己的利益,因为我还在学习编程),我注意到了许多Java项目(来自看起来很受尊重的程序员),他们使用这些项目某种立即下行.

我实际上有多个例子,但这是我直接从代码中提取的一个例子:

public Set<Coordinates> neighboringCoordinates() {
    HashSet<Coordinates> neighbors = new HashSet<Coordinates>();
    neighbors.add(getNorthWest());
    neighbors.add(getNorth());
    neighbors.add(getNorthEast());
    neighbors.add(getWest());
    neighbors.add(getEast());
    neighbors.add(getSouthEast());
    neighbors.add(getSouth());
    neighbors.add(getSouthWest());
    return neighbors;
}
Run Code Online (Sandbox Code Playgroud)

从同一个项目中,这是另一个(也许更简洁)的例子:

private Set<Coordinates> liveCellCoordinates = new HashSet<Coordinates>();
Run Code Online (Sandbox Code Playgroud)

在第一个示例中,您可以看到该方法的返回类型为Set<Coordinates>- 但是,该特定方法将始终只返回HashSet- 而不是其他类型Set.

在第二个例子中,liveCellCoordinates最初定义为a Set<Coordinates>,但立即变为a HashSet.

而且这不仅仅是这个单一的,具体的项目 - 我发现在多个项目中就是这种情况.

我很好奇这背后的逻辑是什么?是否有一些代码约定会考虑这种良好做法?它能以某种方式使程序更快或更高效吗?它有什么好处?

Ted*_*opp 13

在设计方法签名时,通常最好只确定需要固定的内容.在第一个示例中,通过仅指定方法返回a Set(而不是HashSet具体),如果事实证明a HashSet不是正确的数据结构,则实现者可以自由地更改实现.如果声明该方法返回a HashSet,则还需要修改依赖于该对象的所有代码,HashSet而不是更通用的Set类型.

一个现实的例子是,如果决定neighboringCoordinates()需要返回一个线程安全的Set对象.如上所述,这将非常简单 - 用以下方法替换方法的最后一行:

return Collections.synchronizedSet(neighbors);
Run Code Online (Sandbox Code Playgroud)

事实证明,Set返回的对象synchronizedSet()与赋值兼容HashSet.声明该方法返回的好事Set!

类似的考虑适用于第二种情况.使用的类中的代码liveCellCoordinates不应该只知道它是什么Set.(事实上​​,在第一个例子中,我希望看到:

Set<Coordinates> neighbors = new HashSet<Coordinates>();
Run Code Online (Sandbox Code Playgroud)

在方法的顶部.)

  • +1:它是关于你的选择的故意,所以你的最低要求是明确的.使用暗示实际上不需要的东西的类型更难以理解和维护. (2认同)