gpt4 book ai didi

Java:为什么这个方法有副作用?

转载 作者:搜寻专家 更新时间:2023-11-01 04:05:20 25 4
gpt4 key购买 nike

我有一个方法会产生副作用,即使某些变量被标记为 final。为什么是这样?也许我对 final 的作用感到困惑。

@Test
public void testSubGraph() {
WeightedGraph<String, DefaultWeightedEdge> g = generateSimpleCaseGraph();

Graph<String, DefaultWeightedEdge> sub = ChooseRoot.subgraphInDirection(g, "alpha", "l");

assertEquals(g, generateSimpleCaseGraph()); //fails
}

public static <V, E extends DefaultEdge> Graph<V, E> subgraphInDirection(final Graph<V, E> g, final V start, final V sink) {
Graph<V, E> sub = removeEdges(g, start, sink);
return removeUnconnectedNodes(sub, start);
}

private static <Vertex, Edge extends DefaultEdge> Graph<Vertex, Edge> removeEdges(final Graph<Vertex, Edge> g, Vertex start, Vertex sink) {
final Set<Edge> outEdges = new HashSet<Edge>(g.edgesOf(start));
boolean removedEdge;

for (Edge e : outEdges) {
if (! (g.getEdgeTarget(e).equals(sink) || g.getEdgeSource(e).equals(sink))) {
removedEdge = g.removeEdge(e);
assert removedEdge;
}
}
return g;
}

private static <Vertex, Edge> Graph<Vertex, Edge> removeUnconnectedNodes(Graph<Vertex, Edge> g, Vertex start) {
ConnectivityInspector<Vertex, Edge> conn = new ConnectivityInspector<Vertex, Edge>((UndirectedGraph<Vertex, Edge>) g);
boolean removedVertex;

final Set<Vertex> nodes = new HashSet<Vertex>(g.vertexSet());
for (Vertex v : nodes) {
if (! conn.pathExists(start, v)) {
removedVertex = g.removeVertex(v);
assert removedVertex;
}
}
return g;
}

最佳答案

final 修饰符仅表示不能重新分配引用。它不会阻止对象的状态被修改。

编辑: 只为汤姆:

public void doSomething1(Object arg)
{
arg = new Object(); // OK.
}

public void doSomething2(final Object arg)
{
arg = new Object(); // Compile error.
}

在这两种情况下,您都可以在 arg 指向的对象上调用方法,包括修改其状态的方法。

关于Java:为什么这个方法有副作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1806078/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com