OOP - 字段与方法

时间:2014-11-13 11:10:56

标签: java oop

这个问题不是特定于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对很多东西都很方便,但对我而言,这似乎并不是其中之一。我这样想错了吗?

2 个答案:

答案 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添加额外的逻辑。