这是检查图表是否为二分图的代码。我的问题是关于断言。 我想要检查以验证图形是否为空。有效的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;
}
}
}
}
答案 0 :(得分:1)
仅调试代码的安全交易效率是一种很好的做法。
通常会添加非常复杂的仅调试的完整性检查代码,以检查整个数据结构的完整性。
如果您考虑减少此类检查的数量,那么只有当代码放慢速度以至于妨碍您的开发过程时,才会这样做。
答案 1 :(得分:0)
assert
未启用。如果通过使用-ea
选项启动JVM来显式启用它,则实际上只会运行检查。我们的想法是在开发过程中启用断言,并在生产中禁用以解决您提到的权衡问题。
话虽如此,我发现在生产中进行此类检查很有用,这就是为什么我更喜欢使用Guava的Preconditions
代替assert
关键字,因为使用前者的检查将始终运行。与代码的其他部分相比,由于这种检查导致的性能下降通常可以忽略不计,并且它可以帮助调试难以调试的错误。