gpt4 book ai didi

java - 优先选择私有(private)静态方法而不是实例方法

转载 作者:行者123 更新时间:2023-12-02 01:30:43 25 4
gpt4 key购买 nike

我面临着一个奇怪的情况。我实际上是第一次尝试 JUnit 测试。多年来我一直被教导静态方法不好(除了某些情况)。

但是

我发现在我的类中拥有一些私有(private)静态方法非常好。主要原因是我可以控制方法中内部的所有内容:我确信我只能控制和更改参数。

任何例子都是微不足道的,事实上它只是一种“防止自己在错误的情况下用错误的对象做错事”的方法,也许是因为我忘记了一个对象必须是从方法执行的开始到结束都是一样的。就像封装一样。

所以,我正在解释最后一种让我这样思考的情况:

class Graph {
private Set<Edge> edges;

// {...}

public void newEdge(Edge e) {
edges.add(e);
edges = simplify(edges);
}

private static Set<Edge> simplify(Set<Edge> input) {
// do something
return output;
}
}

这不是:

private static Set<Edge> simplify(Set<Edge> input) {
// do something
return output;
}

比安全

private void simplify(Set<Edge> input) {
// do something
this.edges = output;
}

请告诉我我是否生气了。非常感谢

最佳答案

并不是说静态方法不好,而是它们有特定的用途。

首先,我们讨论的是私有(private)方法,因此类外部的任何代码通常不会调用它。因此,只有该类的开发人员才会编写代码来调用它。这意味着它被错误调用的可能性较小。

此外,您对该类的测试应该验证它是否按照应有的方式执行。

其次,静态方法无法访问对象内部的实例变量。因此,如果该方法的目的是读取或修改实例变量,则它不能是静态的。

如果该方法执行的计算在变量的内部突变以及想要为外部调用者执行相同服务的公共(public)静态方法中是常见的,则该方法应该是静态的。但如果情况并非如此,则不需要是静态的。

编辑:例如:

如果您没有外部需要执行简化:

class Graph {
private Set<Edge> edges;

// {...}

public void newEdge(Edge e) {
edges.add(e);
simplify();
}

private void simplify() {
// use this.edges as your input
// do something
// set the value of your output to this.edges
}
}

另一次编辑:

an object has to be the same from the beginning to the end of the execution of the method

如果多线程环境中的一致性对您来说是一个问题,则需要使用适当的线程同步方法 - 不要依赖于仅在方法末尾修改对象。

关于java - 优先选择私有(private)静态方法而不是实例方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56102898/

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