我的一般问题是何时将参数传递给构造函数以及何时将其传递给 一个类的方法。 一般来说,对象是“数据”+“作用于数据的方法”。
我有几个选项来设计一个名为 DFS 的类。以下哪个示例套件定义最好?
选项 1:图形在构造函数中传递,源在函数中传递。 Adv:相同的 DFS 对象将被不同的源重用。
public class DFS {
Graph g;
public DFS(Graph g) {
this.g = g;
}
public void doDfs(int source) {
// dfs computation
}
}
选项 2:具有 2 个参数且无多态性的构造函数 缺点:对于每个新源都需要构造新对象。
public class DFS {
Graph g;
int source;
public DFS(Graph g, int source) {
this.g = g;
this.source = source;
}
public void doDfs() {
// dfs computation
}
}
选项 3:重载构造函数 Adv:解决我们所有的用例。 Dis:多态性的成本很高。
public class DFS {
Graph g;
int source;
public DFS(Graph g) {
this.g = g;
}
public DFS(Graph g, int source) {
this.g = g;
this.source = source;
}
public void doDfs() {
doDfs(source);
}
public void doDfs(int source) {
// dfs computation
}
}
选项 4:无构造函数
public class DFS {
DFS() { }
public void doDFS(Graph g, int source) {
this.g = g;
this.source = source;
// dfs computation
}
}
最佳答案
当你有一些与类的操作/定义相关的东西时,那么它就意味着作为构造函数传递。这也意味着,我们非常希望将其设置为不可变
。例如:
public class DFS {
final Graph g;
public DFS(Graph g) {
this.g = g;
}
public void doDfs(int source) {
// dfs computation
}
}
在这里您知道DFS
类包含多个方法(每个方法都有自己的算法)来查找图g
的DFS
。在这种情况下,您知道 g 是不可变的,并且为每个方法调用传递它会很痛苦,因此最好将其作为构造函数参数。一些优点:
- 每个方法调用都没有多余的参数。
- 如果您想进行一些内部缓存,您可以这样做。这是因为一切都与已知实体相关:
g
- 线程安全,无显式锁定。你需要它和 setter 一起使用。
简而言之,当您知道某些内容不会更改类的定义时,请将其作为构造函数参数。具有使用这些实例变量的方法。当您知道某些内容可以更改时,请使用 Setters。
关于java - 何时使用构造函数以及何时传入参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18052069/