这个问题不是特定于Java的,但代码示例是Java。
有时您会遇到非常简单的对象,例如以下代码:
public class Coordinates {
private int x;
private int y;
public Coordinates (int x, int y) {
this.x = x;
this.y = y;
}
public void setX (int x) { this.x = x; }
public void setY (int y) { this.y = y; }
public int getX () { return x; }
public int getY () { return y; }
}
我想说直接访问字段而不是通过方法会更有效。此外,代码看起来更简单。使用本身会更简单,类定义将没有(不必要的样板代码)4方法,而不是真正做任何事情。 (在某种程度上,我考虑使用类似于C中的struct
或Pascal中的record
。
我这样做的方式可能是这样的:
public class Coordinates {
public int x;
public int y;
public Coordinates (int x, int y) {
this.x = x;
this.y = y;
}
}
那为什么第一种方式似乎更受欢迎?感觉就像强迫某些东西成为一个对象。它只是将这些值组合成一个变量,为什么只使用OOP呢?没错,我保留了构造函数。它最初分配值时实际上很方便,但实际上不需要其他方法,除了可能设置两个字段的方法set
(如构造函数)。
我知道OOP对很多东西都很方便,但对我而言,这似乎并不是其中之一。我这样想错了吗?
答案 0 :(得分:0)
没有人强迫程序员定义4个getter / setter。如果您愿意,可以创建2个字段public
并分别定义没有getter / setter。
但你必须确保将来这背后的原始想法将保持不变,即没有人会需要非平凡的吸气剂/制定者。如果是这种情况,您可以填写字段public
并直接访问它们。
答案 1 :(得分:0)
脱离我的头脑,有几个原因:
(1)约定 - 当我有一个我不熟悉的库中的对象时,何时执行.get我的IDE实际上为我提供了一个属性列表。如果我在一个我不太熟悉的图书馆工作,这可能是一个优势。
(2)序列化 - 许多库,例如Jackson Framework,都使用bean作为标准。然后,框架通过查看开始获取或设置的方法来确定对象具有哪些属性。显然,这不是一个严格的约束,但它很方便。
(3)并发 - 直接公开属性依赖于客户端来使对象线程安全。如果我有getter和setter,那么我可以确保他们使用适当的同步。因此,我可以保证我的对象的线程安全。显然,它更好地为对象实现自己的线程安全而不是依赖客户端。当我第一次写一个对象时,我可能事先不知道是否应该实现线程安全。
(4)可维护性 - 您可能希望在将来的某个时刻为您的getter或setter添加额外的逻辑。