Java:私有变量和返回方法的必要性

4
在代码中,我看到有些人经常使用私有变量,例如:
private static int number;

它们通常具有以下访问方法:

public static int returnNumber(){

    return number;

}

但我的问题是,这有什么意义呢?我的做法如下:
int number;

当我需要访问它时,接下来就是:

int numberToBeAssigned = someClass.number;

替代

int numberToBeAssigned = someClass.getNumber();

对我来说,使用访问器方法和私有变量似乎不太实用。我知道它们是什么,私有变量只允许被位于其中的类所访问。但我并没有看到需要它们的必要性,因为你可以轻松地实例化该类并在需要时调用其成员变量。显然我的逻辑是错误的,但我希望有人能给出一个清晰的示例说明如何利用私有变量以及访问器方法。
谢谢

1
这很快就会被关闭,因为它被认为是“没有建设性的”,但是让我说一下,你并没有,只是可能从未处理过真正的大型项目。private允许您拥有保证的“只读变量”,如果没有这些变量,调试可能会成为一个无法解决的噩梦。 - Ernest Friedman-Hill
5个回答

6

访问器的目的在于允许您重新设计实现,而不会破坏所有其他代码。例如,假如您后来决定从文件中获取number ,或者将其移动到另一个类中,如果您通过访问器进行访问限制,那么您只需更改访问器,而不必更改依赖于它的所有其他代码。


太好了!现在更有意义了。谢谢。 - Blackvein

2
这篇文章主要讲的是封装。公共字段让任何一个类都可以改变你的值,可能会破坏你的不变性。如果你只有一个 public int foo,任何人都可以设置它。如果它是一个 private int foo 并且你提供了一个 getter,人们只能获取它。如果你提供了一个 getter 和 setter,那么他们就可以做两者,但是你仍然对它有控制权;你可以拒绝破坏该类必须(或想)做出的假设的更改。
现在这个类可能没有这样的假设,但是 a) 你将来可能会有一些假设,b) 其他类确实有这些假设,因此需要保护它们的私有字段,并且最好有一种一致的访问数据的方式(在某些情况下不是字段,而是在其他情况下使用getter和setter)。
但事实上,这是关于基本的面向对象原则:你的类不仅仅是一个状态块,它是一个具有属性和操作的东西 - 在底层具有反映这些操作的状态。例如,当你请求一个 List 的 length() 时,你并不在概念上关心它是否报告为缓存值还是 List 遍历其元素并计数;你只想知道它的长度。
这就带我们来到最后一个重要的点(至少在这个答案中 :)),那就是 getter 和 setter 可以被覆盖以利用继承,而字段则不能。

0
这里是来自wikipedia的观点:
封装对象的内部可以保护其完整性,防止用户将组件的内部数据设置为无效或不一致的状态。封装的好处是可以减少系统复杂性,从而增加鲁棒性,让开发人员限制软件组件之间的相互依赖关系。

0

有很多关于这些问题的书籍,答案无法在stackoverflow的回答格式中完全解释清楚。实际上,这非常重要。简而言之,在您的代码中提供的评估员越少,您就有更多机会在重构时更改它,而不会损坏那些使用它的人的代码。您的代码变得干净而强大,您可以实现更好的不可变性,您可以做出更好的架构决策。


0

简短回答: 您希望通过尽可能少地发布组件的一部分并强制该组件在应用程序中的行为与其在隔离状态下(可以轻松测试)的行为尽可能接近来最小化不必要的交互。

更长的回答: 类型的方法代表其合同,而其变量代表其状态。任何非平凡类型都将包含多个成员变量,具有它们自己的相互关联的状态。随着该类型提供的功能(新功能或扩展功能、错误修复)的发展,程序员必须记住所有这些关系,以确保现有行为不会被破坏。

实现这一点的一种经过充分验证的方法是编写单元测试,但这些测试仅在隔离状态下验证类型。通过最小化类型状态的曝光并将其限制为经过深思熟虑和计划的操作,程序员试图最小化他或她能够测试的模型的干扰。

相反,如果外部组件有办法访问设计者未计划的组件状态,那么它们很容易无意中破坏其行为。组件之间的交互是指数级的:根据我的经验,一旦程序理解超过20,000行代码,由多个开发人员编写,每个人专门负责不同的模块,并经过多次修订,就没有人会完全了解整个代码。

许多关于这个主题的书籍和文章已经被写出来了,我相信它们会比我更雄辩和有说服力。对于Java的一般最佳实践,我强烈推荐Josh Bloch的《Effective Java》(第二版)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接