代码之家  ›  专栏  ›  技术社区  ›  Frankie

Java,将主类传递给子类,错误的编码风格?

  •  3
  • Frankie  · 技术社区  · 15 年前

    请你容忍我,因为我仍然在抓捕爪哇人。

    下面的示例从一个名为 Parent main 方法。然后它会使该实例进行各种计算。

    接下来它会触发一个名为 Child 通过 起源 引用实例 儿童 .

    这个 儿童 只是坐在那里监视事情,有时,会触发公共方法 起源 .

    它起作用了。问题是, 这种款式不好吗 ? 还有别的吗 Java思维方式 做这种工作?

    public class Parent {
    
        // main function that fires up the program
        public static void main() {
    
            // creates an instance of himself
            // and fires go that does all sorts of fuzzy calculus
            Parent parent = new Parent();
            parent.go();
    
            // creates a new thread of child and starts it
            Child child = new Child(parent);
            child.start();
        }
    
        private void go() {
            // all sort of initializations
        }
    
        public void getDataFromChild(int data) {
            // will get data from running child thread
        }
    }
    
    
    
    public class Child extends Thread {
        private Parent parent;
    
        // child constructor grabs Parent instance into "o"
        public Child(Parent o) {
            parent = o;
        }
    
        // this class main loop
        public void run() {
            while(1==1) {
                doSomething();
                try {
                    sleep(1000);
                }
                catch(Exception e) { }
            }
        }
    
        private void doSomething() {
            parent.getDataFromChild(1);
        }
    
    }
    

    谢谢您。

    7 回复  |  直到 15 年前
        1
  •  5
  •   Julius Musseau    15 年前

    子类化线程被认为是错误的样式。最好实现Runnable,然后将Runnable交给线程(hmmm。。。相当类似于你父母/孩子的交接!).

    Runnable r = new Child(parent);
    new Thread(r).start();
    

    否则你的Child.java代码在我看来很好。

    要实现Runnable,只需提供run()方法:

    public class Child implements Runnable {
      private Parent parent;
    
      public Child(Parent parent) { this.parent = parent; }
    
      public void run() {
        // what the thread does goes in here...
      }
    
        2
  •  2
  •   Stephen C    15 年前

    问题是,这是一种糟糕的风格吗?有没有更多的Java思维方式来完成这类工作?

    向“子”对象传递对其“父”的引用既不是好样式,也不是坏样式。只是编程而已。

    在一个实际的应用程序中(而不是你的高度人工的例子),你可以判断这是否是好的 设计 .

        3
  •  1
  •   Community Mohan Dere    9 年前

    除了 Julius Davies “回答,我对这样的代码还有一个顾虑:

        Child child = new Child(parent);
    

    也就是说, 为什么? 这孩子有自己的想法,而且 孩子要和父母做什么?

    如果父线程真的像看起来那样微不足道,那么子线程似乎就没有必要了。另一方面,如果父线程在子线程启动后做了更多的工作,则需要处理同步问题。你呢 必须 对付他们。墨菲定律认为 可以 发生了, 发生了。(科拉里:即使你是墨菲定律的专家,也有比你意识到的更多的线程问题。)

    编辑 :好,子线程调用 parent.getDataFromChild . 这个方法对数据有什么作用?(它是否对同样从主线程访问的对象进行了任何更改?)因为它是从子线程调用的,所以您需要检查父类和子类是否存在可能的竞争条件。

        4
  •  1
  •   fastcodejava    15 年前

    我看这个没什么问题,除了 Child 类应该实现 Runnable . 只要你记录下 Parent 儿童 看起来不错。

        5
  •  0
  •   Dave L    15 年前

    如果在其他地方引用了子对象,则需要重写父对象上的finalize方法以清除子对象。否则我完全可以接受。

        6
  •  0
  •   Jason Rogers    15 年前

    关于你写的东西,最好让孩子在线程中运行

    http://www.javabeginner.com/learn-java/java-threads-tutorial

    那么关于这是否是一个好方法的问题,答案是:这取决于你想做什么,哈哈

    你可以调查几件事:

    • 捕捉各种异常,如

    中断异常

    • 读取同步的以防止同时访问/修改。

    • 您可以检查observer类/设计模式来控制线程何时唤醒以进行测试,而不是休眠

    最后,我想让您在Java:D中体验线程化应用程序的美妙世界

    编辑:正如Dave L所指出的,你需要注意清理你引用的内容,否则你的程序中会出现僵尸^^

        7
  •  0
  •   Dennis C    15 年前

    我从你的代码中读到的是一个坏的循环依赖。

    您可以使用接口来移除依赖项。