2010-03-24 123 views
2

如果我们可以通过setter和getters访问私有成员,那么private有什么用?公共和私人访问修饰符

+1

哪种语言? – 2010-03-24 05:08:34

+3

@Frank并不重要...... – 2010-03-24 05:10:42

回答

1

因为获取者和设置者可以充当代理。它们使得你可以隐藏类的实际内部,只允许外部类通过方法访问数据。无论你想要什么,都可以让你对待课堂的内部人员。

仅仅因为你的getter/setter被命名为getName()而你的财产被称为name,并不意味着它永远是那样的。

如果您想将变量更改为fullName,该怎么办?如果您直接访问公共变量,则更改会破坏很多代码。相反,您可以简单重新映射getName()从哪里获取数据。

我最好的例子之一是我自己的URL类,我允许创建和操作一个URL。如果你想设置该方案,你可以得到$obj->setScheme()。但是,您不知道每次更改URL时是否手动生成字符串,无论是将它们存储为单独的部分。这给了我灵活性,因为我可以存储您的数据,但我想。

此外,我可以在存储数据之前对数据进行预处理。在我的URL类中,我假定所有的方案和主机名都是小写的。我可以通过将通过setHost()保存的所有字符串转换为小写,然后存储它们来标准化。如果我使用公共变量,则必须假定将数据放入的客户端正确存储它。

它们还可以验证正在传入的信息,以确保它是有效的数据,如果不是,则会导致错误。

1

没有人强迫你为每个变量放入getter和setter。事实上,即使很多“面向对象的封装”教程出于某种原因始终这样做,所以对每个变量盲目使用私有成员+虚拟获取者& setter是毫无意义的。首先,从并发的角度来看,封装是没有封装。

3

您需要的私人执行封装。它是面向对象编程的基本范式之一,用于保持独立于界面的某些东西的实现。这减少了不同程序部件之间的耦合,并且从长远来看使其更易于维护。

看看下面的例子:

class toto { 
    private String someThing; 

    public String getSomething(); 
    public void setSomething(String Something); 
} 

如果更改上面简单地把一些公众,确保你有更少的代码,但如果有一天,有什么需要改变,以更复杂的对象一些新功能而旧的代码仍然可以正常使用字符串,那么你需要改变一切。通过隔离的东西的内部表示,你可以更容易

class toto { 
    private ComplexSomeThing someThing; 

    public String getSomething(){ someThing.toString();} 
    public void setSomething(String something){ something = new ComplexSomeThing(something);} 
    public ComplexSomeThing (getComplexSomething(); 
    public void setComplexSomething(ComplexSomething someThing); 
} 

还有其他原因,使封装件好事(TM)进化系统,这仅仅是一个愚蠢的例子来说明这一点。


编辑 有一个辩论有点的,现在来使用保护VS私人或使用属性的概念类似于在一些语言(DELPHI,C#),而不是getter和setter方法(如Java中)。 受保护的而不是私有的将允许代码的客户更容易的更改,但它确实暴露了系统的内部,所以在API的可用性和可维护性之间寻求平衡。然而,封装的基本原则仍然存在。 无论选择哪个选项,仍然需要展示连贯且在相同抽象级别上的功能,并隐藏关于如何完成的血淋淋的细节。

对我来说,辩论不是要宣布对私有的圣战,而是要找到一种方法来提供可扩展性和灵活性,同时不破坏API的连贯性。

Heresomeinteresting阅读有关私人,如果你想进一步挖掘。不过,我必须强调,在形成对私人的意见之前,你应该真正掌握encapsulationpolymorphism的概念,它们的表面简洁性隐藏了一些细微的complexities

0

我认为你到目前为止有很好的答案(信息隐藏和所有这些)。只是想添加一个关于使用setter的建议。

正如你所提到的使用访问器使私有变量有点没有意义,并且在某些环境中,使用getters和setter的性能后果使它变得毫无价值。

另一方面,如果你没有这样的担忧,我认为使用getters并不是那么糟糕,但是在使用setter之前你应该三思。他们让你的对象可变这是特别难以维护的并发环境。