获取方法的必要性

9

可能是重复问题:
为什么要使用getter和setter?

这是一个新手问题。是否非常必要使用get方法来访问属性值?一旦值被分配,可以直接获取值。例如,在下面的代码中,displayName()可以显示firstName值,而不需要任何getter方法的帮助。或者说,必须具有getter和setter方法或任何其他提供该值的方法,这是标准编码规范吗?

class Test{

    private String firstName;

    public void setName(String fname){
        firstName = fname;
    }

    public void displayName() {
        System.out.println("Your name is " + firstName);
    }
}          
6个回答

12

告诉,不要问是面向对象设计中的重要原则。通常情况下,您应该告诉对象去做某些事情,而不是询问它们问题。getter/setter方法无处不在,这种做法会导致你被鼓励到达对象内部并获取字段(甚至更糟糕的是,在设置器的情况下进入并搞乱事情)。这会破坏封装性并使您的代码更难理解。

在您的特定情况下,我会创建一个名为Name的对象,它具有接受名称的构造函数和单个显示名称的方法。


4

对于您的情况(显示显示名称),不需要提供Getter。

但是如果您想在另一个类中使用该字段,则需要提供Getter方法。


3

Getter和Setter是Java Beans的标准接口的一部分,并且许多框架(如Hibernate)都需要它们。当然,你可以自行决定何时需要它们以及其目的。它们提供对私有成员变量的访问,并且甚至可以为你提供更多功能而不仅仅是简单地获取和设置。

面向对象软件的重点是重用。这意味着其他程序员或者说在未来的几年里,可以将代码用于其他系统中。

当你具有私有成员变量并使用get/set函数时,你可以更改函数的内部实现而不会破坏所有使用它的其他代码。


2

我没有任何支持这一观点的链接,但这是我的做法。

如果非静态字段不必要,我会尽量避免使用公共字段。因此,我只使用受保护和私有字段。从类内部,您可以访问它们而无需使用get/set,这是完全可以的。从类外部,始终尝试使用get/set。

所以,你的示例代码对我来说完全没问题。:)

编辑:唯一的例外是如果我创建了一个类似于struct的容器类,像这样:

class Point4D {
  public int x1, x2, x3, x4;
}

我认为公共字段是可以的。不过最好还是将它们设为私有,并以public int x1()等方式命名getter方法。一旦这个容器引入了一些改变实例状态的方法(比如改变x1/x2/x3/x4的值),我会将它们设为私有并添加get/set方法。


2

请始终使用Getter和Setter来访问您的属性!

您应该看一下这篇文章...


3
即使涉及到包私有类和嵌套类,也是如此吗? - Eugene
3
如果您想从类内访问字段(如此示例中的情况),这是否也适用?我认为不是... 这篇文章只谈到外部访问和公共字段的替代使用(我同意应尽量减少使用公共字段)。 - brimborium

2

拥有私有状态,封装是好的,在很多情况下这是正确的做法。假设您的类应该是线程安全的,如果您有公共字段,则无法确保。

另一方面,有些情况下这是无用的!假设您只在一个包中访问对象,并且确定您永远不会导出它,那么为什么要费心呢?


1
很确定你可以使用volatile关键字实现。 - Woot4Moo
2
@Woot4Moo,使用volatile关键字确保的唯一一件事情就是可见性,这对于线程安全来说是不够的。 - Eugene
1
这似乎有争议:https://dev59.com/Cmsz5IYBdhLWcg3wlYwn - Woot4Moo
1
@Woot4Moo 但你不能做任何复合操作.. - Eugene

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