回答
你所指的是Encapsulation。它是面向对象编程的基石之一。你通常想要限制其他代码的能力来混淆你的类的内部结构。
想象一个简单的例子,其中将整数值设置为负值将使您的班级发生灾难性故障。有了一个setter
,你可能能够更好的东西解决这个问题,比如像这样:
public void setNumber(int number)
{
if (number < 0)
{
number = 1;
}
this.number = number
}
或者(更可能)
public void setNumber(int number)
{
if (number < 0)
{
throw new Exception("Number can't be less than 0");
}
else
{
this.number = number
}
}
正如评论所指出的Raveesh夏尔马下面,这就是所有实例变量应该被声明为私有的原因。
http://stackoverflow.com/questions/7622730/why-instance-variables-in-java-are-always-private – 2012-04-16 13:44:11
这是封装的面向对象原理的一般实现。有很多情况下,使用setter没有或者没有什么优势。但是,有些情况下它可以帮助您避免发现错误。
例
Class Person
Integer age;
....
setAge(Integer age)
{
if (this.age<age || age>120)
{
Throw new RuntimeException("The age: "+age+"is invalid");
}
else {
this.age=age;
}
作为该计划的增长的复杂性,这可以帮助你找出错误前面。由于您可能事先不知道程序如何随着时间的推移而发展,因此通常最好谨慎一些,并使用getter/setter来开始。大多数IDE使这相当无痛。
您确定可以通过直接访问给定实例中的属性来分配值,但这绝对违背了Java Object Oriented原则的基础。
Java OO中的最佳实践建议您通过使类属性保密,并通过getter/setter访问它们来封装类中的属性。
应用此原则是减少类之间耦合的一种方法。
你并不需要向使用getProperty()
或setProperty()
(被称为getter和setter方法),但它是在Java中访问类级属性的首选方式。它是面向对象编程中使用的一个基本原理,称为封装,它根据所有权,隐私级别,对象树中的层次结构等定义哪些对象应该访问哪些属性。
它还允许您用你的属性做更高级的事情,比如让它们同步。这允许您在访问属性时确保顺序被保留,以便您不会按顺序覆盖值。
当我第一次学习编程时,所有这些东西对我来说并不明显,但随着您对编程的了解越来越多,原因和好处开始出现并变得更有意义。
如果您的问题已被回答,或者如果它不再有效,请勾选以选择最合适的答案,以便大家都知道问题已得到解决。谢谢。 – wattostudios 2012-05-14 13:36:03