0

封装经常更改的代码是一种常见的做法。实际上,它通常以使用对象的形式将变化的逻辑委托给。示例如下:

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;
    }
}

你能给出一些赞成和反对这样做吗?

4

1 回答 1

1

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

优点:

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

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

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

缺点:

  1. 是静态的,不用多说
  2. 除了保护条款之外,您没有任何优势。如果您的类不是静态的,则可以将其与实现相同接口的其他类或从该类继承的其他类交换。
于 2013-10-04T02:08:25.070 回答