OOD -设定值一次,不能更改



我正在努力理解信息隐藏的原理。假设我有一个带有getSpeed、setSpeed、getEngine、setEngine、getVIN、setVIN等方法的车辆类。为了执行信息隐藏,我不想给客户端类setVIN的能力,因为一辆车只有一个VIN(我可能错了)。我有点困惑如何让这个类应用信息隐藏。我不想把setVIN设为私有。但是如何设置一次VIN,之后不允许再次设置呢?或者我应该这样做吗?

信息隐藏意味着您不会暴露内部VIN字段以供外部直接修改。使用setter并不违反隐藏原则,因为您可以控制字段的修改。

在你的例子中,如果你想确保VIN只设置一次,最好的方法是在构造函数中设置它,并删除setVIN。

顺便说一句,虽然这是一个普遍的问题(这很好),但如果您心中有一种特定的语言,它可能值得一提。例如,有些语言不允许非默认构造函数。在这种语言中,我会保留setVIN,但让它在调用时检查VIN是否已经设置。如果有,要么忽略调用,要么抛出异常。

仅仅因为一个类/对象有一个属性,从概念上讲,并不意味着它应该是公共的。一个"属性"可以被分配& &;由"getter" &"setter"函数,但只能将需要的函数公开为public。

你可以说:"Show me the code":

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

它没有经过测试,但是,我想,它解释了我的观点

最新更新