2012-08-09 51 views
9

可能重复:
Why use getters and setters?必要性的getter方法

这是一个新手的问​​题。使用getmethods访问属性值非常有必要吗?一旦赋值,就可以得到值目录。例如,在下面的代码中,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); 
    } 
}   

回答

12

Tell, Don't Ask是面向对象设计的重要原则。通常你应该告诉物体做事情而不是问问题。因为鼓励你进入一个物体并进入田野(或者更糟糕的是进入并在探测器的情况下戳动物),每个地方的吸气/吸气装置都会阻碍这种做法。这破坏了封装并使你的代码难以推理。

你的具体情况,我会创建一个名为Name有一个构造函数取的名字,并显示其单一方法的对象。

2

请务必使用Getter和Setter来访问您的属性!

你应该看看this article...

+3

即使在包私有类和嵌套类的情况下? – Eugene 2012-08-09 12:36:02

+3

这是否也适用于如果你想访问类内的字段(如他在这个例子中)?我不这么认为......这篇文章只谈到外部访问和替代使用公共领域(我同意应该尽量减少)。 – brimborium 2012-08-09 12:36:04

4

你的情况(在显示名称)它时并不需要提供消气。

但是,如果你想使用另一个类的领域,我们需要提供getter方法。

3

getter和setter方法是Java组件和许多框架如Hibernate的标准接口的一部分,期待他们在的地方。这就是说,你当然决定是否以及何时需要它们以及为了什么目的。它们提供对私人成员变量的访问,甚至可以让你有机会做更多的事情,而不仅仅是简单的获取和设置。

面向对象软件的重点是重用。这意味着其他程序员,或者从现在开始,您可以将代码用于其他系统。

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

2

拥有私有状态,封装好,并在案件很多,这是正确的事情。假设你的班级假设是线程安全的,并且公开的字段不能保证。

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

+1

很确定你可以用'volatile'关键字。 – Woot4Moo 2012-08-09 12:37:13

+2

@ Woot4Moo你要确保挥发的唯一的事情是能见度,这是不够的线程安全 – Eugene 2012-08-09 12:38:45

+1

这似乎不同意:http://stackoverflow.com/questions/7805192/is-a-volatile-int-in -java-thread-safe – Woot4Moo 2012-08-09 12:40:58

2

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

我试图避免公共领域,如果他们不是静态的。所以我只是使用受保护和私人领域。从课堂内部,你可以在没有获得/设置的情况下访问它们,这是完全正确的。从课外,总是尝试使用get/set。

因此,您的示例代码完全正常对我来说。 :)

编辑:为我一个人例外是,如果我创建了一个结构状容器类这样

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

那么我认为公共领域是好的。尽管如此,让它们变得更私密并命名为吸气者public int x1()等等会更好。只要有一些方法被引入到这个容器中,它改变了实例的状态(比如改变x1/x2/x3/x4的值),我将它们设置为private并添加get/set。