何时使用构造函数以及何时传入参数
我的一般问题是何时将参数传递给构造函数,以及何时将其传递给类的 方法。 通常,对象是“数据”+“作用于数据的方法”。何时使用构造函数以及何时传入参数
我有几个选项来设计一个名为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个PARAMS和没有多态性 Disadv:对于每个新的源需要构建新的对象。
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:过载构造 进阶:解决我们的所有用例。 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
}
}
回答:
如果您有与类的操作/定义关联的东西,那么它意味着作为构造函数来进行传递。这也意味着,它将非常希望将它作为immutable
。例如:
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
- 线程安全,没有显式锁定。你会需要它与setters。
总之,当你知道某些事情不会改变时,就把它作为类的定义,把它作为构造函数的参数。有使用这些实例变量的方法。使用Setters,当你知道什么可以改变。
回答:
这是一个逻辑问题。当你设计你的类时,这个类的对象需要特定的数据才是有效的,那么数据必须在构造函数中提供。您还应该通过使用assert
来检查对象是否已实际通过。
但你可以选择来设计你的课程,以便稍后添加数据。这取决于你打算如何使用你的班级 - 你应该为你的班级的用户设计班级。
顺便说一句,你在你的帖子中评论说“多态现象代价高昂”。不,如果多态性能为你完成工作,那么它并不昂贵。这也取决于你的意思是什么样的多态性。
回答:
个人而言,我更喜欢选项4.没有构造函数或最小构造函数使得使用单元测试来测试类变得更容易。
另外在较大的项目中,我更喜欢创建只包含参数的新类,然后将这样的类用作参数。如果大量传递相同的参数,则可以在不更改所有方法的情况下稍后进行更改。
以上是 何时使用构造函数以及何时传入参数 的全部内容, 来源链接: utcz.com/qa/266156.html