最近我和朋友讨论了创建公共API的良好实践,当我们谈及返回类型时开始产生争论。他告诉我只返回广义类型,例如List而不是ArrayList。但是在我看来这完全取决于我们要解决的问题。我认为以下代码没有任何问题:
ArrayList foo();
当我想要表达“嘿,我给你一个ArrayList,只是为了确保你能在O(1)时间内访问到元素”。
在下一个例子中,假设方法签名或文档中没有关于返回的图的种类或表示形式的信息。
Graph foo();
现在怎么办?我可能会想知道这个图是有向还是无向的,基于邻接列表还是邻接矩阵。最糟糕的是,它可能会导致像这样的代码:
ArrayList foo();
当我想要表达“嘿,我给你一个ArrayList,只是为了确保你能在O(1)时间内访问到元素”。
在下一个例子中,假设方法签名或文档中没有关于返回的图的种类或表示形式的信息。
Graph foo();
现在怎么办?我可能会想知道这个图是有向还是无向的,基于邻接列表还是邻接矩阵。最糟糕的是,它可能会导致像这样的代码:
Graph graph = foo();
if(graph instanceof DirectedGraph)
//code
这违反了Liskov替换原则。
你有什么想法?