Java 中的结构类似对象

2022-08-31 06:20:22

它是否完全反对Java创建类似对象的结构的方式?

class SomeData1 {
    public int x;
    public int y;
}

我可以看到一个类的访问器和赋值器更像Java。

class SomeData2 {
    int getX();
    void setX(int x);

    int getY();
    void setY(int y);

    private int x;
    private int y;
}

第一个示例中的类在符号上很方便。

// a function in a class
public int f(SomeData1 d) {
    return (3 * d.x) / d.y;
}

这并不方便。

// a function in a class
public int f(SomeData2 d) {
    return (3 * d.getX()) / d.getY();
}

答案 1

似乎许多Java人不熟悉Sun Java编码指南,该指南说,如果Java支持“struct”(当没有行为时),当类本质上是“Struct”时,使用公共实例变量是非常合适的。

人们倾向于认为 getter 和 setter 是 Java 的方式,就好像它们是 Java 的核心一样。事实并非如此。如果您遵循 Sun Java 编码指南,在适当的情况下使用公共实例变量,那么您实际上正在编写更好的代码,而不是用不必要的 getter 和 setter 来混淆它。

Java代码约定从1999年开始,仍然没有改变。

10.1 提供对实例和类变量的访问

不要在没有充分理由的情况下公开任何实例或类变量。通常,实例变量不需要显式设置或获取 - 经常作为方法调用的副作用发生。

适当的公共实例变量的一个示例是,类本质上是一个数据结构,没有行为。换句话说,如果您使用结构而不是类(如果Java支持结构),那么将类的实例变量公开是合适的

http://www.oracle.com/technetwork/java/javase/documentation/codeconventions-137265.html#177

http://en.wikipedia.org/wiki/Plain_old_data_structure

http://docs.oracle.com/javase/1.3/docs/guide/collections/designfaq.html#28


答案 2

真正使用常识。如果您有类似的东西:

public class ScreenCoord2D{
    public int x;
    public int y;
}

那么把它们包装在getter和setters中就没有多大意义了。您永远不会以任何其他方式以整个像素存储x,y坐标。Getters和setters只会减慢你的速度。

另一方面,使用:

public class BankAccount{
    public int balance;
}

您可能希望在将来的某个时间点更改余额的计算方式。这应该真正使用 getter 和 setter。

最好知道你为什么要应用良好的做法,这样你就知道什么时候可以改变规则。