我是Java新手......我的问题是
要不访问类之外的数据成员,我们使用Access修饰符,以及为什么我们使用setter方法在类之外修改它们。 例如: -
public class Test
{
private int a=10;
private int b=20;
public void sum(int x, int y)
{
System.out.println("Sum is:"+(x+y));
}
public void setA(int a)
{
this.a=a;
}
public void setB(int b)
{
this.b=b;
}
}
与这些类型的案例一样,为什么我们不使用公共成员,而不是在setter方法的帮助下修改它们?在哪种类型的情况下我们需要使用setter ......?
我无法理解......有人请帮帮我
由于
答案 0 :(得分:4)
它被称为封装。 Mutator方法确保以预期和受控方式修改字段。
答案 1 :(得分:3)
因为您的要求可能会发生变化。
public void setA(int a)
{
if (a >= 0) {
this.a=a;
}
}
如果您刚刚使用了公共成员,则必须在设置a
值的任何地方更改代码。如果您使用setter方法,则只需在一个地方更改代码。
答案 2 :(得分:0)
封装的好处:
一个简单的用例:
您希望仅保留最低a
:
private int a;
public void setA(int a) {
if(this.a > a)
this.a = a;
}
然后你改变主意,希望保持最大a
:
public void setA(int a) {
if(this.a < a)
this.a = a;
}
如果您尚未使用setA()
方法,则必须更新您尝试将新值设置为a
的每个位置。但是,如果您使用了setA()
,那么除了setter
方法之外,您无需触及任何其他位置。
请看一下类似的问题:
答案 3 :(得分:0)
根据OOP,您应该始终使用私有属性来封装信息,并确保另一个程序员或对象由于对变量的错误操作而影响任何方法功能,例如:
private int a=10;
private int b=20;
public void div()
{
System.out.println("Div is:"+(a/b));
}
public void setA(int a)
{
this.a=a;
}
public void setB(int b)
{
if(b!=0)
this.b=b;
}
例如,在这种情况下,setter验证(我应该抛出错误或其他东西)不会将0保存为属性,因为如果它发生,它将损坏 div 方法。
因此,当您需要保护属性上的数据时,或者您希望确保属性中保存的任何值不会影响对象内的功能/方法时,您可以使用setter。
p.d:对不起我的英文。
答案 4 :(得分:0)
在一个classical biology experiment中,一群猴子很想抓住一根香蕉,给每个人带来冷水淋浴。他们很快停止尝试。渐渐地,猴子被新人取代,每个新手都学会了不接触香蕉的艰难方式:接受退伍军人的一轮踢腿和叮咬。很快就没有原始成员了;没有人在场见证了冷水淋浴,事实上这种机制早已被关闭。然而,新手仍然因为尝试吃香蕉而遭到殴打。
在我们的故事中,香蕉是公共场所,猴子就在你身边。不严肃地避开公共场地不是最佳做法;这是一种宗教活动。有一个标准的“论据”支持它,但没有一个普遍存在。仅举几例:
“要求可能会改变” - 对纯数据对象的设置器的要求永远不会改变;它是稳定API最纯粹的例子之一。在业务逻辑设置中,域模型上的getter / setter绝不能做除纯粹获取/设置之外的任何事情,因为它们在许多不同的上下文中使用,包括测试,并且一定没有意外。除了保留设定值之外的所有其他问题都在getter / setter代码之外处理;
“内部表示可能会更改” - 存储int
的最佳方式是int
,String
位于{ {1}},等等。从来没有真正出现这种情况的情况;
“公共字段打破封装,OOP的内容” - 公共getter和setter没有有效的封装,它是一种没有现实生活效果的形式;
“公共字段阻止通过框架代码进行检测/建议” - 只需看看Hibernate:它允许公共字段与getter / setter平等。这是现代Java中一个已解决的问题。
您可以在每种情况下使用直接字段访问,其中所讨论的类仅是本地使用的,而不是作为公共API公开。此外,如果一个类表示纯数据,在许多情况下即使在公共API中也可以使用公共字段。例如,请参阅Java标准库中的String
。
答案 5 :(得分:0)
属性(在您的情况下为a和b)描述了Object的状态。因此,在OOP中将状态设置为私有并且仅通过公共方法访问它们是一种很好的做法。
只有存在公共设置者/获取者时,才能访问私有属性。因此,这为您提供了灵活性以及限制访问权限的选项(如果需要)。