Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这是Java中很好的类设计实践吗?_Java_Design Patterns - Fatal编程技术网

这是Java中很好的类设计实践吗?

这是Java中很好的类设计实践吗?,java,design-patterns,Java,Design Patterns,在上面的代码中,另一个类被实例化并作为OneClass的类变量保存 这种设计的后果是什么? 这是一种好的做法吗? 这会支持单元测试吗? 很难进行单元测试,因为您无法以正常的方式模拟外部依赖关系。例如,使用groovy测试,您可以使用模拟覆盖私有字段 我认为最好有一个接受另一个类的构造函数,而不是通过构造函数在单元测试中模拟它。这称为组合,是Java语言的基本部分。它没有什么问题,在很多情况下可能是必不可少的 我要做的唯一更改是使用依赖项注入来简化测试,也就是说,您可以通过以下方式提供另一个模拟类

在上面的代码中,另一个类被实例化并作为OneClass的类变量保存

这种设计的后果是什么? 这是一种好的做法吗? 这会支持单元测试吗?
很难进行单元测试,因为您无法以正常的方式模拟外部依赖关系。例如,使用groovy测试,您可以使用模拟覆盖私有字段

我认为最好有一个接受另一个类的构造函数,而不是通过构造函数在单元测试中模拟它。

这称为组合,是Java语言的基本部分。它没有什么问题,在很多情况下可能是必不可少的

我要做的唯一更改是使用依赖项注入来简化测试,也就是说,您可以通过以下方式提供另一个模拟类对象:-

public class OneClass {
        private AnotherClass anotherClass = new AnotherClass();

        private void doOneJob(){
            anotherClass.doOtherJob();
        }
    }

你是说适配器模式吗?是的。依赖注入看起来不错。但是,我在AnotherClass.java中有一个本机lib调用。如果我能成功地模拟AnotherClass.java,我想依赖项注入会处理这个本机库。是的,本机方法可以像其他方法一样被重写,除非它们是final。您应该创建一个接口,并在实现类中提供此方法的单独实现。更具体地说,模式可以是组合模式,也可以是聚合模式,具体取决于innerObj。仅存在于包装器对象内部,甚至作为独立对象存在于外部
public class OneClass {
    private AnotherClass anotherClass;

    public OneClass(AnotherClass anotherClass){
        this.anotherClass = anotherClass;
    }

    private void doOneJob() {
        anotherClass.doOtherJob();
    }
}