我试图了解信息隐藏的原理。假设我有一个车辆类,其中包含诸如 getSpeed、setSpeed、getEngine、setEngine、getVIN、setVIN 等方法。为了强制信息隐藏,我不想让客户端类能够 setVIN,因为车辆只有一个 VIN (我可能错了)。我对如何让这个类应用信息隐藏有点困惑。我不想将 setVIN 设为私有。但是您如何设置一次 VIN 并且之后不允许再次设置呢?或者我什至应该那样做?
问问题
1093 次
2 回答
2
信息隐藏意味着您不会暴露内部 VIN 字段以便从外部直接修改。拥有一个 setter 并不违反隐藏原则,因为您可以控制字段修改。
在您的情况下,如果您想确保 VIN 只设置一次,最好的方法是在构造函数中设置它,然后删除 setVIN。
顺便说一句,虽然这是一个一般性问题(这很好),但如果您有特定的语言,可能值得一提。例如,某些语言不允许使用非默认构造函数。在那种语言中,我会留下 setVIN,但让它在调用时检查 VIN 是否已经设置。如果有,要么忽略调用,要么抛出异常。
于 2011-10-05T09:41:17.050 回答
0
仅仅因为类/对象具有属性,从概念上讲,并不意味着它应该是公共的。可以使用“getter”和“setter”功能分配和更改“属性”,但您只能公开您需要的那些。
你可能会说,“给我看代码”:
public class JavaClass {
// hidden field "name"
protected String name;
// start property "Name"
// note: uses "name" field to store the property
public void setName(String value) {
//set passed parameter as name
name = value;
}
public String getName() {
return name;
}
// finish property "Name"
// start property "Id"
// note: uses "name" field to store the property
public void setId(String value) {
//set passed parameter as name
name = value;
}
public String getId() {
return name;
}
// finish property "Id"
// hidden field "years"
protected int years
// functions works as "read-only" properties
public int Years() {
return years;
}
// start constructor
public JavaClass() {
name = "unknown";
years = 1;
}
// finish constructor
public static void main(String args[]) {
JavaClass javaObject = new JavaClass();
//set name member of this object
javaObject.setName("Visitor");
// print the name
System.out.println("Hello: " + javaClassExample.getName());
//set name member of this object
javaObject.setId("Employee");
// print the name, not the Id, but are the same
System.out.println("Hello: " + javaClassExample.getName());
// and current years of age
System.out.println("Years: " + javaClassExample.Years());
} // public static void
} // class JavaClass
它没有经过测试,但是,我认为,它解释了我的观点。
于 2011-10-05T15:36:54.730 回答