Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java OOP-字段与方法_Java_Oop - Fatal编程技术网

Java OOP-字段与方法

Java OOP-字段与方法,java,oop,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; }

这个问题不是特定于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在很多方面都很方便,但对我来说这似乎不是其中之一。我这样想是不是错了?

没有人强迫程序员定义4个getter/setter。如果愿意,可以将这两个字段设置为public,并分别定义no getter/setter


但你必须确保在未来,这背后的原始想法将保持不变,即没有人会需要非琐碎的getter/setter。如果是这样,您可以将字段
公开
并直接访问它们

在我看来,有几个原因:

(1) 约定-当我从一个我不熟悉的库中得到一个对象时,当我这样做时。get my IDE有效地为我提供了一个属性列表。如果我在一个我不太熟悉的图书馆工作,这可能是一个优势

(2) 序列化—许多库,如Jackson框架,都使用bean作为标准。然后,框架通过查看开始get或set的方法来决定对象具有哪些属性。显然,这不是一个硬约束,但很方便

(3) 并发性-直接依赖客户机公开属性以使对象线程安全。如果我有getter和setter,那么我可以确保它们使用适当的同步。因此,我可以保证我的对象的线程安全。显然,对象最好实现自己的线程安全性,而不是依赖于客户机。当我第一次编写对象时,我可能事先不知道是否应该实现线程安全


(4) 可维护性-您可能希望在将来的某个时候为getter或setter添加额外的逻辑。

长话短说:因为情况会发生变化,当时间到来时,您需要添加行为/验证,您需要创建setter和getter。如果那时有30个其他应用程序使用你的库并直接调用你的公共字段,那么祝你好运重构所有这些应用程序。@dcastro所说的就是我一直使用getter和setter的原因。但当你想到它时,你很可能会编写一个终端应用程序,其他应用程序都不依赖它。我的most编码是直接用于游戏开发的,在每个对象上都有公共的x、y、spd和what,这非常清楚,并且很容易使用。到目前为止,积分为+1。不过还有一点,请记住,在Java中,至少setter和getter通常是内联的。因此,它们没有性能成本,因为它们相当于直接公开字段,但不需要进行维护权衡。@Heimdall提供的例子实际上是一个很好的例子。典型的例子是带有
x
y
字段的类
Point
。根据定义,一个点可以有任何
x
y
坐标,因此将来不太可能需要添加验证。灵活性和可维护性:如果今天您认为您不需要验证或处理数据,良好的面向对象设计可以确保您为未来做好计划。