【问题标题】:How to apply decoupling on these two coupled classes如何在这两个耦合类上应用解耦
【发布时间】:2012-05-05 08:04:10
【问题描述】:

我有两个班级:

public class CourseModule {

  // attributes...

  List<Course> courses;

  public void addCourse() { ... }
}

public class Course {

  // attributes...

  CourseModule module;
}

Course 的属性不足以唯一地标识一个对象,课程模块始终是必需的,对于附加信息也是如此。 CourseModule 由差异 Courses 组成。

这里我不喜欢的是循环依赖,感觉不对。现在我正在考虑以下内容,而不是为每个方法添加课程并手动设置 CourseModule 引用,我可以使用构造函数自动执行此过程:

public Course(...,...,...., CourseModule module) {

   this.module = module;
   module.courses.add(this);
}

但是,这里还有另一个大问题:在 Brian Goetz Java Concurrency in Practice 中说:不要让 this 引用转义构造函数

那么这里的最佳做法是什么?我认为这是一个非常简单的示例,可能会产生示例解决方案。

【问题讨论】:

  • 课程是否需要知道其 CourseModule?
  • 模块中的courses.add(new Cource(..., this)) 怎么样?您正在设置的是双向父子(或容器-容器)关系。

标签: java oop circular-dependency


【解决方案1】:

有趣的是,我不得不做类似的事情。见my question here

我在互联网上找到了this post,这几乎与您正在尝试做的事情完全相同,当然也包括课程!我发现指定的解决方案并非 100% 正确,需要考虑我的问题的答案。

【讨论】:

    【解决方案2】:

    你是对的,我会说你当前的设置是Code Smell的一个例子。

    你能不能创建另一个对象CourseInfo 来管理你说不能包含在Course 中的附加课程信息?

    public class CourseModule {
    
        List<Course> courses;
    
        public void addCourse(Course course) { ... }
    }
    
    public class Course {
    
        CourseInfo info;
    }
    
    public class CourseInfo {
    
        CourseInfo info;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-09
      • 2015-11-14
      相关资源
      最近更新 更多