Java 通过公共方法访问私有成员变量
我刚刚学习了OOP。我对班级里的私人成员有些困惑 我看到了一些关于将变量成员设置为private的示例,这样就不会在其他任何地方更改它 但另一方面,有一些公共方法,例如Java 通过公共方法访问私有成员变量,java,c++,oop,Java,C++,Oop,我刚刚学习了OOP。我对班级里的私人成员有些困惑 我看到了一些关于将变量成员设置为private的示例,这样就不会在其他任何地方更改它 但另一方面,有一些公共方法,例如getName()和setName()来获取和设置私有成员名 通过方法改变和直接改变有什么不同?有人能给我解释一下吗?此模式的主要参数是如本文所述的封装 但是必须承认,在您的名称示例中没有太多的封装 与公共字段相比,getter/setter方法有两个优点: 当通过setter方法设置值时,可以检查并拒绝无效值,而如果字段是公共字
getName()
和setName()
来获取和设置私有成员名
通过方法改变和直接改变有什么不同?有人能给我解释一下吗?此模式的主要参数是如本文所述的封装 但是必须承认,在您的
名称示例中没有太多的封装
与公共字段相比,getter/setter方法有两个优点:
当通过setter方法设置值时,可以检查并拒绝无效值,而如果字段是公共字段,则无法控制分配给它的值
您不需要提供setter和getter方法,从而可以使字段有效地成为只读或只读
使用方法更改它可以让您更好地控制要应用于访问成员变量的逻辑
例如,如果成员变量是只读
变量,则可以省略set
方法的实现,这样就没有人可以写入内容
另一方面,如果您只想写入一个变量,而不想让任何人稍后读取它,您可以实现set
方法
setters将为您提供的另一件事是,您可以在提交值之前进行验证。例如,如果您希望将特定格式的字符串
设置为成员字符串
变量,则可以在setter
函数中检查它,如果它与模式匹配,则接受它,如果不匹配,则拒绝它
通常,通过getter
和setter
更改/读取成员变量是最佳实践。一般经验法则是,您希望对类属性和扩展点(private>protected>public)尽可能地限制。这在运行时间较长且需要维护和重新分解的项目中尤为重要
一旦您的属性被使用了一段时间,就很难将它们从public限制为protected/private,因为您不知道还有多少其他类依赖于这些公共属性。另一方面,从私人放松到受保护/公共放松的创伤较小,因为你不必担心以前没有该类课程就可以进入该物业
话虽如此,getter和setter为您提供了与类的私有成员交互的独特联系点。这在OOP中称为封装。这意味着您可以确保与这些属性交互的每个人都以相同且一致的方式进行交互。一个愚蠢的例子是属性的标准化:
private String name;
public void setName(String name) {
this.name = StringUtils.capitalize(name);
}
在这里,您可以确保无论谁设置名称,都不需要关心名称的大小写,因为您是通过setter强制执行名称的。这同样适用于getter,根据需要应用业务规则
将其与访问公共财产相比较,您需要在每次使用公共财产时利用公共财产
最后,我想说,盲目地向对象添加getter和setter是一种不良做法。只有在有充分理由存在这些访问器时才提供它们。例如:
class Person {
private name;
public Person(String name) {
this.name = name
}
public String name() {
return name;
}
}
通常情况下,您不会设置一个人的姓名,因此我们可以一起忽略该设置器。但每个人都有自己的名字。在这种情况下,您可以通过其构造函数强制执行它。这使得这种区别更加明确,增强了您的设计,并防止您的对象处于不一致的状态。阅读此论坛帖子。您可能会发现许多有价值的要点来理解这些概念。
下面的示例类getter和setter显示了一些好的实践。我们需要使用const
类型限定符等。我们还可以验证实现中的值
例如:-
我可以总结以下使用访问者的好理由:
- 使未来的改变更容易
- 用属性封装行为
- 将您的公共界面与更改隔离
- 设置不同的访问级别
- 在设置或获取之前验证值
您想了解访问修饰符,我的朋友。这里有一个链接。请不要只提供链接答案。
class ClassName{
string name;
int age;
int weight;
public:
void setName(string strName);
void setAge(int iAge);
void setWeight(int iWeight);
string getName() const { return name; }
int getAge() const { return age; }
int getWeight() const { return weight; }
};