在 class 中使用私有变量或 public 方法哪个更好?
Which is better practice, using private variables or public methods within the class?
示例:
private int x = 4;
public TestClass(int x) {
this.x = x;
}
public TestClass(int x) {
setX(x);
}
public void setX(int x) {
this.x = x;
}
第一个构造函数更好还是第二个?我问这个是因为当我将 类 封装在 IntelliJ IDEA
中时,如果我之前使用 this.x = x
,它会将其更改为 setX(int newX);
。
有个词叫Self Encapsulation
。 Martin Fowler 写了一篇关于这个主题的博客。 Blog Link。总而言之,有时您可能在 setter
中有初始化或分配逻辑。所以我认为,最好在您要初始化或赋值时调用 setter
。
在大多数情况下,这都是个人喜好。如果它的值不依赖于其他变量,我会使用第一个构造函数。但是,setter 方法允许在修改变量值之前满足某些条件。例如:
private int x;
public TestClass(int x) {
setX(x);
}
public void setX(int x) {
// Some random condition depending on other variables.
if (System.currentTimeMillis() & 1 == 0) {
this.x = 5;
} else {
this.x = x;
}
}
如果有许多条件无法用三元语句轻松表示,则使用 setter 方法是有意义的。
如果 class 是抽象的,那么扩展它的具体 class 可能会覆盖 setter 方法,从而修改变量的值。如果您计划使用自封装并且不希望任何子 class 覆盖 setter 方法,只需将 final
关键字添加到方法声明中。
视情况而定。
派生的类可以覆盖setter,你需要决定覆盖的效果在特定地方是好是坏.
我的意见是,如果setter被记录为可覆盖的,则需要注意使用setter与赋值。如果您没有将 setter 记录为可覆盖,则只需使用赋值即可。
你已经接受了一个答案,但是,我仍然看到一些没有人提到的东西。 setter 使您的 class 可变(至少在没有保护条件的情况下),这可能是好事,也可能不是好事。但是,如果将值提供给构造函数,则使 class 不可变会容易得多。
不可变 classes 本质上是线程安全的,在可行的情况下应该是首选。因此,在您的(诚然非常简单的)示例中,我更喜欢使用构造函数,并且我只有一个 getter 作为值。
IMO,有一个构造函数接受一个值 和 一个 setter 设置相同的值是代码香气如果不是气味。
示例:
private int x = 4;
public TestClass(int x) {
this.x = x;
}
public TestClass(int x) {
setX(x);
}
public void setX(int x) {
this.x = x;
}
第一个构造函数更好还是第二个?我问这个是因为当我将 类 封装在 IntelliJ IDEA
中时,如果我之前使用 this.x = x
,它会将其更改为 setX(int newX);
。
有个词叫Self Encapsulation
。 Martin Fowler 写了一篇关于这个主题的博客。 Blog Link。总而言之,有时您可能在 setter
中有初始化或分配逻辑。所以我认为,最好在您要初始化或赋值时调用 setter
。
在大多数情况下,这都是个人喜好。如果它的值不依赖于其他变量,我会使用第一个构造函数。但是,setter 方法允许在修改变量值之前满足某些条件。例如:
private int x;
public TestClass(int x) {
setX(x);
}
public void setX(int x) {
// Some random condition depending on other variables.
if (System.currentTimeMillis() & 1 == 0) {
this.x = 5;
} else {
this.x = x;
}
}
如果有许多条件无法用三元语句轻松表示,则使用 setter 方法是有意义的。
如果 class 是抽象的,那么扩展它的具体 class 可能会覆盖 setter 方法,从而修改变量的值。如果您计划使用自封装并且不希望任何子 class 覆盖 setter 方法,只需将 final
关键字添加到方法声明中。
视情况而定。
派生的类可以覆盖setter,你需要决定覆盖的效果在特定地方是好是坏.
我的意见是,如果setter被记录为可覆盖的,则需要注意使用setter与赋值。如果您没有将 setter 记录为可覆盖,则只需使用赋值即可。
你已经接受了一个答案,但是,我仍然看到一些没有人提到的东西。 setter 使您的 class 可变(至少在没有保护条件的情况下),这可能是好事,也可能不是好事。但是,如果将值提供给构造函数,则使 class 不可变会容易得多。
不可变 classes 本质上是线程安全的,在可行的情况下应该是首选。因此,在您的(诚然非常简单的)示例中,我更喜欢使用构造函数,并且我只有一个 getter 作为值。
IMO,有一个构造函数接受一个值 和 一个 setter 设置相同的值是代码香气如果不是气味。