封装什么不变?

时间:2013-10-03 06:40:17

标签: java design-patterns

通常的做法是封装经常更改的代码。实际上,它通常采用使用对象来委托变化逻辑的形式。样本如下:

public class SampleClass {
    Object obj = new ObjectWithVaryingMethod();
    public SampleClass(Object obj){
        this.obj=obj;
    }
    public String getString(){
        return obj.toString();
    }
    public static void main(String args[]){
        SampleClass sampleClass=new SampleClass(new ObjectWithVaryingMethod());
        System.out.println(sampleClass.getString());
    }
}

class ObjectWithVaryingMethod{
    @Override
    public String toString(){
        return "Hi";
    }
}

你能否说一下“封装”在不变的情况下可能遇到的问题?当主类本身经常发生变化或改进时,我发现它是一种很好的编码行为。样本如下。在第二种情况下,检索“Hi”,这是不变的部分,被“封装”在另一个类中。

public class SampleVaryingClass {

    public static void main(String args[]) {
        //here I may opt to print getHi's value on sysout or on a dialog
        System.out.println(ObjectWithNonVaryingMethod.getHi());
    }
}

在一个完全不同的班级......

public class ObjectWithNonVaryingMethod {
    private static final String hi = "Hi";
    //"Hi" should always be returned
    public static String getHi() {
        return hi;
    }
}

你可以给一些专业人士和骗子吗?

1 个答案:

答案 0 :(得分:1)

两个代码都无法相互比较。一个是静态的,另一个不是。我希望您理解在第一个代码中封装对象的概念。这是第二个的利弊。请记住,静态“通常”不好,默认情况下不支持并发。

的优点:

  1. 使用getHi,您将字符串字段保持为私有,这意味着无法从其他来源设置

  2. 假设你需要从其他来源做setHi,你可以为它添加几个保护条款。这称为defensive programming

    public static setHi(String input){
        if(input == null) { input = ""; } // can throw exception instead
        hi = input;
    }
    
  3. 缺点:

    1. 这是静态的,不用说
    2. 除了保护条款之外,你没有任何优势。如果您的类不是静态的,则可以将其与实现相同接口的其他类或从该类继承的其他类交换。