OOD - 设置一次,使其无法更改

时间:2011-10-05 09:35:26

标签: java oop information-hiding

我试图理解信息隐藏的原理。假设我有一个车辆类,其中包含getSpeed,setSpeed,getEngine,setEngine,getVIN,setVIN等方法。为了强制执行信息隐藏,我不希望为客户端类提供setVIN的能力,因为车辆只有一个VIN (我可能错了)。我对如何使这个类应用信息隐藏感到困惑。我不想让setVIN成为私有的。但是如何设置VIN一次并且之后不允许再次设置VIN?或者我应该这样做?

2 个答案:

答案 0 :(得分:2)

信息隐藏意味着您不会公开内部VIN字段以便从外部进行直接修改。拥有一个setter并不违反隐藏原则,因为你可以控制字段修改。

在你的情况下,如果你想确保VIN只设置一次,最好的方法是在构造函数中设置它,然后删除setVIN。

顺便说一下,虽然这是一个普遍的问题(这很好),如果你有一个特定的语言,可能值得一提。例如,某些语言不允许非默认构造函数。在那种语言中,我会离开setVIN,但是在调用时检查是否已经设置了VIN。如果有,则忽略该调用,或抛出异常。

答案 1 :(得分: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

它没有经过测试,但我认为,它解释了我的观点。