在Java中,为什么将字段同时设置为公共的setter和getter方法是不好的?
在Java中,为什么将字段同时设置为公共的getter和setter是不好的?
即使现在看起来使用getter/setter方法没有意义,因为它们没有做任何有趣的事情,但你需要思考当需求改变时可能会发生什么。你可能会发现在设置值时需要添加一些验证;你可能会发现需要改变整个实现,使得“get”方法实际上从多个数据片段计算一个值,或者从文件中读取一个值,或者其他一些操作。当这种情况发生时,如果你有其他类直接访问data字段,你将会陷入困境。你将无法按照你需要的方式改变实现,而需要付出很大的痛苦。我从维护别人杂乱代码的长期苦涩经验中得出了这个结论。
问题的出现原因是:在字段上同时设置公共的getter和setter方法,可能会导致在需求变更时无法灵活修改实现,存在代码维护上的困难。
解决方法是:不要直接访问字段,而是通过使用私有的getter和setter方法来访问和修改字段的值。这样,当需求变更时,你可以自由地修改getter和setter方法的实现,而不需要修改其他类中直接访问字段的代码。这种封装的方式可以提高代码的灵活性和可维护性。
下面是一个示例代码,展示了如何使用私有的getter和setter方法来访问和修改字段的值:
public class MyClass { private int data; public int getData() { return data; } public void setData(int newData) { // 这里可以添加验证逻辑 data = newData; } }
通过这种封装的方式,当需求变更时,你可以轻松地修改getter和setter方法的实现,而不会影响其他类中访问字段的代码。这样,你就可以避免维护其他人杂乱代码的痛苦经历。
在Java中,为什么将字段同时设置为公共的setter和getter方法是不好的?
这是因为你可以控制其他类如何设置数据。你可以对输入进行检查,甚至根据一定的规则修改输入。
例如:
public class SomeClass{ private int data; public void setData(int data){ if (data < 1000){ this.data = data; } else{ data = -1; } } public int getData(){ return this.data; } }
想象一下,如果你将所有的变量(不仅仅是基本类型)都设为公共的。你将不可避免地遇到一个障碍,无法仅仅将变量A设置为变量B,而不经过某种预处理。
为了解决这个问题,我们可以使用封装(Encapsulation)的概念。将字段设置为私有的,并提供公共的setter和getter方法来访问和修改字段。这样,我们可以在setter方法中进行输入验证和处理,确保数据的有效性。同时,我们可以在getter方法中对数据进行加工和转换,以便其他类能够以我们期望的方式使用数据。
通过使用封装,我们可以更好地控制数据的访问和修改,保证数据的一致性和安全性。这也提高了代码的可维护性和灵活性,使得我们可以在不影响其他类的情况下修改字段的实现细节。
因此,在Java中将字段同时设置为公共的setter和getter方法是不好的,通过封装的方式可以更好地解决这个问题。
在Java中为什么将字段同时设置为公共的setter和getter方法是不好的?
为什么需要getter和setter方法?
许多人想知道为什么我们需要在Java中使用访问器和修改器方法(即getter和setter),为什么不能直接访问数据?但是,封装的目的不是隐藏数据本身,而是隐藏操作数据的实现细节。因此,我们需要的是通过公共接口访问这些数据。我们可以在不影响类的公共接口的情况下更改数据的内部表示。相反,通过公开数据本身,我们破坏了封装,从而无法在不影响用户的情况下更改操作这些数据的方式。我们将与数据本身建立依赖关系,而不是与类的公共接口建立依赖关系。当“变化”最终找到我们时,这将导致麻烦。
为什么要封装对字段的访问?
我们可能有几个非常有说服力的原因需要封装对字段的访问。我发现的这些原因的最佳总结在Joshua Bloch的书《Effective Java》中描述的项目14中。在那里,他提到了几个原因,我在这里也提到了:
- 您可以限制可以存储在字段中的值(例如,性别必须为F或M)。
- 当字段被修改时,您可以执行操作(触发事件,验证等)。
- 您可以通过同步方法提供线程安全性。
- 您可以切换到新的数据表示(例如计算字段,不同的数据类型)。
- 您可以使字段只读。
- 等等。
然而,非常重要的是要理解封装不仅仅是隐藏字段。在Java中,我们可以隐藏整个类,从而隐藏整个API的实现细节。
我对这个重要概念的理解得到了Alan Snyder的一篇名为《封装和面向对象编程语言中的继承》的优秀文章的拓宽和丰富。我向所有读者推荐阅读这篇文章。
在Java中为什么将字段同时设置为公共的setter和getter方法是不好的?
封装的目的是隐藏数据的实现细节,而不是隐藏数据本身。因此,通过将字段设置为公共的setter和getter方法,我们破坏了封装,并且无法在不影响类的公共接口的情况下更改操作数据的方式。这将导致与数据本身而不是类的公共接口建立依赖关系,从而在“变化”时可能会遇到问题。
封装对字段的访问可以提供许多好处,如限制字段中存储的值,当字段被修改时执行操作,提供线程安全性,切换到新的数据表示等。因此,将字段设置为公共的setter和getter方法是不推荐的。
为了解决这个问题,我们应该将字段设置为私有,并提供公共的setter和getter方法来访问和修改字段的值。这样做可以实现封装,并且可以在不影响类的公共接口的情况下更改数据的内部表示。这种做法还可以提供更好的代码可维护性和灵活性。以下是一个示例:
public class MyClass { private int myField; public int getMyField() { return myField; } public void setMyField(int value) { myField = value; } }
通过这种方式,我们可以通过公共的setter和getter方法来访问和修改字段的值,而不需要直接访问字段本身。这样可以保护字段的封装性,并且可以在需要时更改字段的内部表示,而不会影响类的公共接口。
总之,在Java中将字段同时设置为公共的setter和getter方法是不好的,因为这破坏了封装,并且无法在不影响类的公共接口的情况下更改操作数据的方式。通过将字段设置为私有,并提供公共的setter和getter方法,我们可以实现封装,并且可以更好地管理和修改字段的值。这样可以提高代码的可维护性和灵活性。