如果我们可以通过setter和getters访问私有成员,那么private有什么用?公共和私人访问修饰符
回答
因为获取者和设置者可以充当代理。它们使得你可以隐藏类的实际内部,只允许外部类通过方法访问数据。无论你想要什么,都可以让你对待课堂的内部人员。
仅仅因为你的getter/setter被命名为getName()
而你的财产被称为name
,并不意味着它永远是那样的。
如果您想将变量更改为fullName
,该怎么办?如果您直接访问公共变量,则更改会破坏很多代码。相反,您可以简单重新映射getName()
从哪里获取数据。
我最好的例子之一是我自己的URL类,我允许创建和操作一个URL。如果你想设置该方案,你可以得到$obj->setScheme()
。但是,您不知道每次更改URL时是否手动生成字符串,无论是将它们存储为单独的部分。这给了我灵活性,因为我可以存储您的数据,但我想。
此外,我可以在存储数据之前对数据进行预处理。在我的URL类中,我假定所有的方案和主机名都是小写的。我可以通过将通过setHost()
保存的所有字符串转换为小写,然后存储它们来标准化。如果我使用公共变量,则必须假定将数据放入的客户端正确存储它。
它们还可以验证正在传入的信息,以确保它是有效的数据,如果不是,则会导致错误。
没有人强迫你为每个变量放入getter和setter。事实上,即使很多“面向对象的封装”教程出于某种原因始终这样做,所以对每个变量盲目使用私有成员+虚拟获取者& setter是毫无意义的。首先,从并发的角度来看,封装是没有封装。
我想你真正想明白的是为什么我们使用公共属性与私人支持领域,而不是仅仅使用公共领域。像这样的SO有几个问题;这里有一个:
What is the difference between a Field and a Property in C#?
您需要的私人执行封装。它是面向对象编程的基本范式之一,用于保持独立于界面的某些东西的实现。这减少了不同程序部件之间的耦合,并且从长远来看使其更易于维护。
看看下面的例子:
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阅读有关私人,如果你想进一步挖掘。不过,我必须强调,在形成对私人的意见之前,你应该真正掌握encapsulation和polymorphism的概念,它们的表面简洁性隐藏了一些细微的complexities。
我认为你到目前为止有很好的答案(信息隐藏和所有这些)。只是想添加一个关于使用setter的建议。
正如你所提到的使用访问器使私有变量有点没有意义,并且在某些环境中,使用getters和setter的性能后果使它变得毫无价值。
另一方面,如果你没有这样的担忧,我认为使用getters并不是那么糟糕,但是在使用setter之前你应该三思。他们让你的对象可变这是特别难以维护的并发环境。
- 1. 私有和公共java访问修饰符基础知识
- 2. C#中私人和公共访问修饰符之间的区别?
- 3. 是私人和公共访问修饰符在性能上有所不同吗?
- 4. 包私人访问修饰符
- 5. 私人访问修饰符的澄清
- 6. 访问修饰符:私人与保护
- 7. 非法修饰的组合:公共和私人
- 8. 单身人士访问私人方法访问公共方法
- 9. Resharper - 如何关闭'私人'访问修饰符?
- 10. 公共访问私人npm模块从私人github回购
- 11. 公共/私人
- 12. Typescript中公共类访问修饰符的用途是什么?
- 13. 如何限制引用库中的公共访问修饰符?
- 14. 私人和公共运算符重载
- 15. 为什么是事件的行动代表使用的“公共”访问修饰符总是表现得“私人”
- 16. 私人和公共财产
- 17. 私人和公共职能
- 18. 私人和公共变量
- 19. Ruby私有和公共访问者
- 20. 访问表单模块中的变量的公共和私人修改器
- 21. 类变量:公共访问只读,但私人访问r/w
- 22. 自助式私人修饰符
- 23. 公共和私人凭证同时访问
- 24. 允许公共和私人访问文件?
- 25. 公共和私人访问为相同的成员函数
- 26. WPF控件的公共类修饰符
- 27. 您应该在Ruby中使用私有,受保护和公共修饰符吗?
- 28. .NET类访问修饰符(朋友和公众)
- 29. Delphi访问修饰符
- 30. 内部访问修饰符
哪种语言? – 2010-03-24 05:08:34
@Frank并不重要...... – 2010-03-24 05:10:42