Java,将主类传递给子类,编码风格不好?

时间:2010-11-17 04:11:41

标签: java implementation

请相信我,因为我仍然掌握Java。

下面的示例从名为Parent的类中读取,该类在main方法上创建自身的实例。然后它使该实例进行各种计算。

接下来,它会激活一个名为Child的线程,将Parent实例作为对Child的引用。

Child只是坐在那里监控事情,有时会在Parent上启动公共方法。

有效。问题是,是这种糟糕的风格?是否有更多的 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 个答案:

答案 0 :(得分:5)

子类化线程被认为是坏的风格。最好实现Runnable,然后将runnable交给一个线程(嗯......非常类似于你的父/子切换!)。

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

答案 1 :(得分:2)

  

问题是,这种风格很差吗?是否有更多的Java思维方式来做这种工作?

传递“子”对象对其“父”的引用既不是好风格也不是坏风格。这只是编程。

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

答案 2 :(得分:1)

除了Julius Davies'回答之外,我对此类代码还有另一个担忧:

    Child child = new Child(parent);

为什么是自己线程中的孩子,而孩子将与父母一起做什么?

如果父母真的像看起来那样微不足道,那么子线程似乎没有必要。另一方面,如果父项在启动子线程后执行更多工作,则您需要处理同步问题。你必须处理它们。墨菲定律说,可以发生的任何线程问题,发生。 (支持:即使你是墨菲定律专家,也有比你所知更多可能的线程问题。)

编辑:好的,子线程调用parent.getDataFromChild。该方法对数据有何影响? (它是否也对从主线程访问的对象进行了任何更改?)由于它是从子线程调用的,因此需要检查父类和子类是否存在可能的竞争条件。

答案 3 :(得分:1)

除了Child类应该实现Runnable之外,我没有看到任何错误。只要您记录ParentChild之间的关系,它就会很好。

答案 4 :(得分:0)

如果在其他地方引用了Child,您将要覆盖父级的finalize方法以清理Child。否则,我似乎完全可以接受。

答案 5 :(得分:0)

关于你写的内容,Child最好是在Thread中运行的Runnable

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

然后关于这个答案是否是一个好方法的问题:这取决于你想做什么LOL

您可以查看以下几点:

  • 抓住各种例外情况,例如
  

InterruptedException的

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

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

最后,我想向您介绍使用Java浏览应用程序的精彩世界:D

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

答案 6 :(得分:0)

我从你的代码中读到的是循环依赖,这很糟糕。

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