可能的重复:
属性和封装
新人警报!
我从 Android 和 Java 开始,我开始理解它,但我想知道为什么我应该使用 getter 和 setter 而不仅仅是公共变量?
我看到很多人创建了一个私有变量并创建了一个 get 和 set 方法。
这里的想法是什么?
可能的重复:
属性和封装
新人警报!
我从 Android 和 Java 开始,我开始理解它,但我想知道为什么我应该使用 getter 和 setter 而不仅仅是公共变量?
我看到很多人创建了一个私有变量并创建了一个 get 和 set 方法。
这里的想法是什么?
它被称为封装,这个概念是面向对象编程的核心。这个想法是你隐藏你的类的实现并且只公开契约,即隐藏如何并且只公开什么。您可以通过将变量设为私有来隐藏变量,并提供公共的 setter-getter 和其他公共方法,客户端调用这些方法与您的类进行通信。它们与方法的实际实现或变量的存储方式无关。
例如,假设您有一个将电话号码存储为 Long 对象的类:
public class ContactInfo {
private Long phoneNo;
public Long getPhoneNo() {
return phoneNo;
}
public void setPhoneNo(Long phoneNo) {
this.phoneNo = phoneNo;
}
}
由于类的客户端只能看到 getter/setter,因此您可以通过将电话号码表示切换为 PhoneNumber 对象来轻松更改类/方法的实现。ContactInfo 的客户根本不会受到影响:
public class ContactInfo {
private PhoneNumber phoneNo;
public Long getPhoneNo() {
return phoneNo.getNumber();
}
public void setPhoneNo(Long phoneNo) {
this.phoneNo = new PhoneNumber(phoneNo);
}
}
public class PhoneNumber {
private Long number;
public PhoneNumber(Long number) {
this.number = number;
}
public Long getNumber() {
return number;
}
}
所涉及的 OOP 概念是封装(google it)。其中一些优点是:您可以为 setter(mutators)和 getter(访问器)指定不同的访问级别,例如 public getter 和 private setter。另一个优点是您可以添加其他代码,而不是更改或检索值。例如,您可能想要检查设置值的有效性,或者您想要抛出异常或引发一些事件以响应将变量更改为某个值。如果您在访问器或修改器中实现这些,您还可以更改它们的实现,而无需更改类外的任何代码。
这个概念称为封装。
它试图做的是将类的内部结构与其行为分开。
例如,假设像这样的类
public class Point{
private float x;
private float y;
public float getX(){
return x;
}
public float getY(){
return y;
}
public float distanceToZero2(){
return x*x + y*y
}
public float getAngle(){
//havent considered the x = 0 case.
return atan(y/x);
}
public boolean isInFirstQuad(){
return x>0 && y>0;
}
}
在这种情况下,封装隐藏了类的内部结构,只暴露了 Point 可用的操作。如果你不喜欢它,你可以改变它的内部结构并保持它的行为(例如,将 carthesian 坐标更改为极坐标)。
任何使用这个类的人都不会关心它,他/她会很高兴他们有一个具有此功能的 Point 类。
除了封装之外,在某些情况下,您还可以控制获取或设置变量的值。例如,您要验证age
应该 >=1 的变量的值
class Person {
private int age = Integer.MIN_VALUE;
public void setAge(int age){
if(age>=1)
this.age = age;
}
public int getAge(){
return age;
}
}
我相信这个想法是“信息隐藏” http://en.wikipedia.org/wiki/Information_hiding
它还用于控制对变量的访问(提供接口)。例如,您可以提供一个 getter 而不是一个 setter,以便它们可以被读取但不能被写入。而如果一切都是公开的,那么任何东西都可以读取和写入变量。
同样重要的是任何检查/验证都需要设置一个变量。例如,您有一个String name
不允许为空的,但如果它是公开的,它很容易被遗忘并设置为name = ""
. 如果您有一个设置器,例如public boolean setName(String newName)
您可以检查newName
s 长度并返回 true 或 false 如果它通过并且已设置或未设置