递归调用中的断言?

时间:2013-08-07 07:47:54

标签: java

这是检查图表是否为二分图的代码。我的问题是关于断言。 我想要检查以验证图形是否为空。有效的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;
            }
        }
    }
}

2 个答案:

答案 0 :(得分:1)

仅调试代码的安全交易效率是一种很好的做法。

通常会添加非常复杂的仅调试的完整性检查代码,以检查整个数据结构的完整性。

如果您考虑减少此类检查的数量,那么只有当代码放慢速度以至于妨碍您的开发过程时,才会这样做。

答案 1 :(得分:0)

默认情况下,

assert未启用。如果通过使用-ea选项启动JVM来显式启用它,则实际上只会运行检查。我们的想法是在开发过程中启用断言,并在生产中禁用以解决您提到的权衡问题。

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