getter setters的例子在Java中是一个糟糕的选择

时间:2011-02-20 04:06:32

标签: java

有人可以提供一个不需要getter和setter的例子吗?

我仍然没有理解,我想一个有很多属性的非常庞大的类必须拥有它们但是在更简单的情况下?

9 个答案:

答案 0 :(得分:9)

对不起,我真的不同意@Stephen C ......

首先,字段始终是私有的(常量除外)。

其次,Setters和Getters非常不同。考虑到@MeBigFatGuy的评论(我完全同意),可以相当自由地使用Getters。但一般来说,查看变量的值通常不会造成太大的损害。 至于制定者 - 你应该(几乎)从不使用它们。我并不孤单,正如你在Joshua Bloch的Effective Java第2版第79页(最小化可变性章节下)中所看到的那样:

  

“...抵制为每个get方法编写set方法的冲动。   除非有充分的理由,否则类应该是不可变的   让它们变得可变。

Setter是邪恶的化身,他们从引入它们的第二个创建代码维护噩梦。开发团队中的每个人现在都会开始操纵数据,创建非常难以修复的可怕错误。字段值应该(几乎)始终在创建时设置,并在整个实例生命周期中保持不变! 我能想到的这个规则的唯一真正例外是JavaBeans和TagHandlers,但这些是非常具体的例子。

总结 - 将所有字段设为私有,在创建时填充它们,不要再次更改它们。这将使您的生活(以及您周围的每个开发人员的生活)变得更加轻松。

答案 1 :(得分:4)

吸气剂和制定者有许多相关的目的:

  • 他们抽象了阶级的状态。一般来说,隐藏实现细节是一件好事。
  • 它们使实现者更容易更改属性的表示类型。
  • 它们可以覆盖子类中的方面。 (无法覆盖公开的属性。)
  • 它们允许类控制访问和更新。例如,setter可以阻止某些客户端代码将属性设置为"错误"值。
  • 它们允许将一个类用作Java Bean。

所有这些都为在各地使用setter和getter提供了令人信服的论据。

在我看来,只有两种情况,吸气剂和制定者是"可选":

  • 当属性仅由类本身使用时;即他们是private
  • 当属性属于轻量级私人内部类时;即一个类,其实例只存在,并且在外层的封装边界内

在这些情况下,使用吸气剂和二传手的原因大多不适用。特别是,由于属性及其类型的可见性仅限于封闭类,因此更改它们的连锁效果仅限于定义类的源代码文件。

但是,如果在代码修订版中存在内部类实现细节泄漏的风险,则应立即添加getter和setter。

答案 2 :(得分:3)

让我们假设您正在编写一个为汽车修理车库建模的程序。你需要一个代表汽车的类。此车库想要知道汽车是否需要更换机油。你可以为

添加getter
public int getMiles()
     and
public Date getLastOilChange() 

- 这似乎很好,两个吸气剂,允许呼叫程序获取有关汽车的信息。现在车库类可以调用这些方法来确定汽车是否需要换油。

但这是错误的。车库不需要或想知道关于这两条信息的任何信息。所有车库类需要知道的是

public boolean needsOilChange()

所以你暴露了车库不需要了解的实施细节。

未来某种类型的汽车可能不会使用此信息来确定是否需要换油,可能还会使用其他一些机制。如果使用上述两种方法,则必须重写车库类。另一方面,如果它使用needsOilChange()方法则不必。

答案 3 :(得分:1)

我的意思是,如果你知道的变量不需要以特定方式访问,请不要使用getter / setter。如果你有一个永远不会通过get改变的变量,请不要包含它。只使用你完成工作所需的东西。

答案 4 :(得分:1)

不需要getter / setter的示例?例如,servlet如何或任何不是简单java bean的类?如果您正在创建一个Web应用程序,例如,您可能有一堆非常简单的Java bean类,例如“Customer”,它们有getter和setter(那些是模型业务域实体的“模型”类) - 但是你还有更多的类,比如servlet和dao类以及其他具有业务逻辑的服务,其中有getter / setter是没有意义的。

答案 5 :(得分:1)

例如,如果它们仅在内部访问,则不需要getter / setter。或者,如果你想打破编码禁忌,你可以把东西设置为公开......虽然你不会想到传统和安全。

答案 6 :(得分:1)

想象一下,你正在制作国际象棋游戏,它有一套棋子和棋盘。你不希望玩家能够获得和设置棋子。这没有任何意义,打破你的游戏。在这个例子中,你也不希望玩家只能设置碎片的位置,否则他们会进行非法移动。您希望有一个移动方法,在获取和设置位置之前检查移动是否合法。

另一个经典案例:银行账户。 你不想让人们只是得到并设定他们的余额,你想提供存款和取款方法,这些方法可以检查余额是否会变为负数,或者也可能记录交易。

答案 7 :(得分:1)

你不希望api用户读取或写入变量的值。 很多时候你可能只是希望用户查看这些值,这意味着设置为只读,然后你只为他们提供get方法。银行详细信息你不希望任何人不小心修改信息。所以不要为他们提供setter方法。

答案 8 :(得分:1)

如果有问题的课程不重要或需要扩展,则需要获取和设置。

对于要用作简单状态的类,直接更改属性不太可能直接对使用它的类或上下文的其他部分进行额外更改,只需要一个getter和setter就没什么意义了。简单的财产就足够了。

来自Java库的好例子是RectangleDimensionInsets

为方便起见,Dimension确实有getter和setter,但属性(width,height)仍然是公共的。