java - 封装什么不变?

标签 java design-patterns

封装经常变化的代码是一种常见的做法。事实上,它通常采用使用对象来委托(delegate)不同逻辑的形式。示例如下:

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

在一个完全不同的类(class)......

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

你能给出一些这样做的优点和缺点吗?

最佳答案

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

优点:

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

  2. 假设您需要从其他来源执行setHi,您可以为其添加几个保护子句。这称为防御性编程

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

缺点:

  1. 不用说,它是静态的
  2. 除了保护条款之外,您不会获得任何优势。如果您的类不是静态的,您可以将其与实现相同接口(interface)的其他类或从该类继承的其他类交换。

关于java - 封装什么不变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19152422/

相关文章:

java - 如何创建一个 "FTPS"模拟服务器以在 Java 中对文件传输进行单元测试

design-patterns - 这是哪种设计模式?

xamarin.ios - 单点触控 : Right manner for using NSNotificationCenter

design-patterns - 了解 Asp.Net 身份界面设计策略

java - AlarmClock.EXTRA_DAYS 如何工作 - Android Studio

Java 13 : Why are javaFX runtime components missing?

java - MongoDB DBRef 列表在 Spring Boot 中返回 null

c# - 在事件聚合器中将枚举与事件类混合

design-patterns - 类(class)互动设计模式

java - 测试数字是否落在 360 度圆的某个 22.5 度范围内的最有效方法