Ano*_*181 74 java getter setter
可能重复:
为什么要使用getter和setter?
我已阅读的书Java
,说这是好事,创建getter和setter方法的变量,如x
和y
.例如:
public int getX(){
return x;
}
public void setX(int x){
this.x = x;
}
Run Code Online (Sandbox Code Playgroud)
但与此有什么不同
...(shape.x)... // basically getX()
Run Code Online (Sandbox Code Playgroud)
和
shape.x = 90; // basically setX()
Run Code Online (Sandbox Code Playgroud)
如果选手和吸气器更好,你能解释一下会出现什么样的实际问题吗?
mpr*_*hat 83
多种原因:
如果你允许字段访问
shape.x = 90
那么你将来不能添加任何逻辑来验证数据.
如果x不能小于100你就不能这样做,但是如果你有这样的安装者
public void setShapeValue(int shapeValue){
if(shapeValue < 100){
//do something here like throw exception.
}
}
Run Code Online (Sandbox Code Playgroud)
虽然对于常数来说
public final String SOMETHING = "SOMETHING";
Run Code Online (Sandbox Code Playgroud)
你将允许字段访问,因为它们无法更改,例如变量,你将它们与getter,setter放在一起.
虽然在这种情况下你必须小心getter方法,以确保你不提供对象的引用(如果你的类有对象作为实例).
我们可以使用getter和setter在任何包中使用私有变量.
很多人都提到封装了实现的细节,对我来说这是在类中使用getter和setter的最大原因.有了这个,您还可以获得许多其他好处,包括能够随心所欲地抛弃和替换实现,而无需触及使用您的类的每一段代码.在一个小项目中,这不是一个很大的好处,但如果你的代码最终成为一个使用良好的(内部或公共)库,它可以是一个巨大的好处.
一个具体的例子:数学中的复数.有些语言将它们作为语言或框架功能,而其他语言则没有.我将在这里使用一个可变类作为示例,但它可以很容易地变成不可变的.
一个复数可以写在表格上,a + bi
包含实部和虚部,非常适合[gs]etRealPart
和[gs]etImaginaryPart
.
但是,在某些情况下,更容易推理极坐标形式的复数re^(i?)
,给出[gs]etRadius
(r)和[gs]etAngle
(θ).
您还可以公开类似[gs]etComplexNumber(realPart, imaginaryPart)
和的方法[gs]etComplexNumber(radius, angle)
.根据参数类型,这些可能需要也可能不需要不同的名称,但是类的消费者可以根据需要使用它们.
这两种形式是可以互换的; 您可以相当容易地从一个转换为另一个,因此类用于内部存储的形式与该类的消费者无关.但是,消费者可以使用任何一种形式 如果您选择表单a + bi作为内部表示,并使用字段而不是getter和setter公开它,不仅强制类使用者使用该表单,您以后也不能轻易改变主意并用内部表示替换re ^(iθ)因为事实证明在您的特定场景中更容易实现.你已经坚持使用你定义的公共API,它要求使用特定的字段名称来暴露实部和虚部.
以下示例可以理解使用getter和setter的另一个好理由
public class TestGetterSetter{
private String name ;
public void setName(String name){
this.name = name ;
}
public String getName(String name){
return this.name ;
}
}
Run Code Online (Sandbox Code Playgroud)
getter和setter的要点是只有它们才能被用来访问它们正在获取或设置的私有变量.这样您就可以提供封装,以后更容易重构或修改代码.
想象一下,您使用名称而不是其吸气剂.然后,如果你想添加类似默认的东西(如果之前没有设置默认名称是'Guest'),那么你将不得不修改getter和sayName函数.
public class TestGetterSetter{
private String name ;
public void setName(String name){
this.name = name ;
}
public String getName(String name){
if (this.name == null ){
setName("Guest");
}
return this.name ;
}
}
Run Code Online (Sandbox Code Playgroud)
get和set不需要getter和setter - 它们只是普通的成员函数.然而,这是一个惯例.(特别是如果你使用Java Bean)
归档时间: |
|
查看次数: |
85809 次 |
最近记录: |