public final fields vs getters / setters?

时间:2017-12-22 01:09:55

标签: java

拥有此代码:

public class MouseEvent extends Event {

    private int x, y;
    private boolean dragged;

    public MouseEvent(int x, int y, boolean dragged) {
        super(Event.TYPE.MOUSE_MOVED);
        this.x = x;
        this.y = y;
        this.dragged = dragged;
    }

    public int getX() {
        return x;
    }
    public int getY() {
        return y;
    }
}

我被告知,"为什么要使用访问者,而不仅仅是公共最终字段?"这让我很困惑。

我到底错过了什么?我的意思是,这些是完全不同的概念。

1 个答案:

答案 0 :(得分:0)

TL;博士

  

这些是绝对不同的概念。

不,他们并非完全不同。

它们是实现相同目标的两种方式:暴露对象的属性。

int x = myMouseEvent.getX() ;

...与...具有相同的效果。

int x = myMouseEvent.x ;

详细

由于无法将对象重新分配给三个类成员字段中的任何一个,并且没有其他复杂性,因此提供getter方法与直接访问公共最终成员具有完全相同的效果。

无论哪种方式,如果您打算永远不会将成员变量重新分配给备用对象,那么您应该通过将变量标记为final来强制执行并记录该意图。这意味着它们实际上不是变量,因为它们的内容(对特定对象的引用)在该对象的生命周期中永远不会变化。

至于定义访问器getter方法,这只有在您现在或以后可能返回除了包含的对象引用之外的其他内容时才有用。例如,如果您需要安全检查或需要计算结果或需要生成格式化响应,那么您需要一个getter方法来编写此类代码。

Java中getter / setter方法的另一个好处是,您可以将对象视为JavaBean,以便在不需要构建BeanInfo的情况下公开属性。在诸如Grid网络应用中的Vaadin小部件中显示对象的情况下,这可能很方便。