为了账号安全,请及时绑定邮箱和手机立即绑定

为什么Java中的getter和setter方法很重要?

为什么Java中的getter和setter方法很重要?

慕姐4208626 2019-11-27 13:53:51
我被教导总是使用吸气剂和吸气剂。但是,我不知道这些方法的优缺点,因为通过实现这些方法,我们将公开数据并隐藏数据。我对此有些困惑。任何人都可以就我们为什么使用吸气剂/塞特剂以及其优点有什么适当的建议吗?
查看完整描述

3 回答

?
杨__羊羊

TA贡献1943条经验 获得超7个赞

基本的“带有公共获取器和设置器的私有字段,除了返回或设置字段之外什么都不做”模式在封装方面确实是毫无意义的,除了它为您提供了以后无需更改API即可对其进行更改的机会。

因此,请不要随意使用该模式。仔细考虑您实际需要的操作。

getter和setter的真正意义在于,仅应在适当的地方使用它们,并且它们不仅可以获取和设置字段,还可以做更多的事情。

  • 你只能有一个吸气剂。然后,该属性为只读。实际上,这应该是最常见的情况。

  • 您只能有一个setter,使该属性可配置,但要传达的是,其他任何内容都不应该取决于它的值

  • 一个getter可以从多个字段计算一个值,而不是返回一个字段。

  • 吸气剂可以制作防御性副本

  • 吸气剂可以延迟执行昂贵的获取操作,并使用字段来缓存值

  • 设置员可以进行健全性检查并抛出 IllegalArgumentException

  • 设置员可以将值的更改通知侦听器

  • 您可以有一个将多个字段设置在一起的设置器,因为它们在概念上属于在一起。这不符合JavaBeans规范,因此如果您依赖期望JavaBeans的框架或工具,则不要这样做。否则,这是一个有用的选项。

所有这些都是隐藏在简单的“ getter and setter”界面后面的实现细节。这就是封装的意义。


查看完整回答
反对 回复 2019-11-27
?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

getter和setter的想法是控制对类中变量的访问。这样,如果需要在内部更改值以其他方式表示,则可以这样做,而无需破坏类外的任何代码。


例如,假设您有一个带有距离变量的类,并且以英寸为单位进行测量。几个月过去了,您在许多地方都使用了此类,突然意识到您需要以厘米为单位来表示该值。如果您不使用getter和setter,则必须跟踪该类的每次使用并在那里进行转换。如果使用了getter和setter,则只需更改这些方法,使用该类的所有内容都不会中断。


public class Measurement

{


    /**

     * The distance in centimeters.

     */

    private double distance;


    /**

     * Gets the distance in inches.

     * @return A distance value.

     */

    public double getDistance()

    {

        return distance / 2.54;

    }


    /**

     * Sets the distance.

     * @param distance The distance, in inches.

     */

    public void setDistance(double distance)

    {

        this.distance = distance * 2.54;

    }

}


查看完整回答
反对 回复 2019-11-27
?
回首忆惘然

TA贡献1847条经验 获得超11个赞

这是不利的一面。Getters / Setters倾向于将类的实现细节向外界公开。那不是好事。假设您正在编写一个Auto Mechanic软件包。因此,您将需要一个Car类,因此您需要公开字段的getter和setter方法。


Date lastOilChangeDate;

int lastOilChangeMileage;

在这个班上。这是因为该软件希望在客户汽车需要换油时发送电子邮件。


但是,当新车问世时,您确定汽车是否需要换油,而不是“每3000英里或3个月”,会发生什么?也许这些新车的油底壳中有一个传感器,可以测量脏度。显然,您希望使用它来确定是否需要换油。


问题是您在使用这些吸气剂/装料器解决了错误的问题。没有人真正想知道上一次换油的时间,他们想知道您是否需要另一次换油。它们只是实现细节,但您已将它们作为界面的一部分。您应该做的是添加了一种方法


public boolean needsOilChange() 

然后Car类可以按需实现。如果更改算法,则不需要Mechanic类,因为它所需要的只是needsOilChange方法。


查看完整回答
反对 回复 2019-11-27
  • 3 回答
  • 0 关注
  • 567 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信