0

这是一个检查图形是否是二分的代码。我的问题是关于断言。我想要一个检查来验证图表是否为空。即使在私有函数中,有效的 java 也鼓励检查。假设我添加了一个断言图!= null,它将被检查多次调用递归函数。这显得低效。如果在调用递归函数之前检查是否完成,那么我们违反了有效 java 中规定的最佳实践,即每个函数都应该验证参数。是否有一些最佳实践/权衡等?谢谢。

private void dfsBipartiteDetector(Graph graph, int vertex, int i) {
    assert graph != null; // <--------- appears inefficient for recursive call.

    visited[vertex] = true;

    vertexSets.get(i).add(vertex);

    final List<Integer> adjList = graph.adj(vertex);
    for (int v : adjList) {
        if (!visited[v]) {
            dfsBipartiteDetector(graph, v, i == 0 ? 1 : 0);
        } else {
            if (vertexSets.get(i).contains(v)) {
                isBipartite = false;
            }
        }
    }
}
4

2 回答 2

1

在仅调试代码中以效率换取安全性是一种很好的做法。

添加相当复杂的仅用于调试的完整性检查代码是很常见的,例如检查整个数据结构的完整性。

只有当代码速度减慢到妨碍您的开发过程时,您才应该考虑减少此类检查的数量。

于 2013-08-07T07:50:59.880 回答
0

assert默认情况下未启用。-ea只有当您通过使用该选项启动 JVM 来明确启用它时,该检查才会真正运行。这个想法是在开发中启用断言,并在生产中禁用以解决您提到的权衡。

话虽如此,我发现在生产中进行此类检查很有用,这就是为什么我更喜欢使用 GuavaPreconditions而不是assert关键字的原因,因为使用前者的检查将始终运行。与代码的其他部分相比,由于这种检查导致的性能下降通常可以忽略不计,并且它可以帮助调试难以调试的错误。

于 2013-08-07T07:54:01.407 回答