你如何从Java中的另一个对象返回调用对象?

时间:2015-07-08 16:12:39

标签: java oop

对象A实例化对象B.

用户与对象B交互后,我想返回到对象A. 因为对象A需要使用对象B中用户确定的结果。用户回答对象B中的问题。

在没有实例化新的Object A并将结果传递给构造函数的情况下,是否仍然可以这样做?或者这是最好的方法?我很好奇,因为不会实例化两个相同类型的对象是浪费吗?

我不想使用内部类,因为除了保持对象A简短之外,我希望其他对象能够使用Assignment类。我正在使用GUI作为用户界面。 //对象A ==主页

//Homework 1
if(e.getSource()==task[0]){
        try {
            AssignmentA hw1= new AssignmentA("questions.txt", 0); //creates Assignment to do

        } catch (Exception e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
    }
    //Homework 2 Button
    else if(e.getSource()==task[1]){
        try {
            AssignmentA hw2= new AssignmentA("questions.txt",1);

        } catch (FileNotFoundException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
    }

//对象B ==作业A

- 创建问题和答案

- 用户选择答案和作业A存储作业的等级。

以下是该方案: 对象A是主页面,允许您通过按钮访问不同的分配,并包含执行多个分配后的总体成绩。对象B是一个赋值类。单击一个按钮时,将实例化对象B,并且用户必须回答问题。一旦用户完成作业,我希望能够返回具有新总成绩的对象A /主页面,而无需创建新的对象A.

我不想使用内部类,因为我还有其他想要使用Assignment类的页面。

4 个答案:

答案 0 :(得分:1)

使用回调,例如:

interface Doer {
    void doSomething(SomeClass data);
}

class B {
    private Doer doer;
    public B(Doer doer) {
        this.doer = doer;
    }
    void run() {
        if (something)
            doer.doSomething(something);
    }
}

class A implements Doer {
    void doSomething(SomeClass data) {
        // whatever
    }

    void callB() {
        B b = new B(this);
        b.run();
    }
 }

答案 1 :(得分:1)

一些想法:

  

以下是场景:对象A是主页面,允许您通过按钮访问不同的作业,并包含执行多项作业后的总成绩。对象B是一个赋值类。单击一个按钮时,将实例化对象B,并且用户必须回答问题。一旦用户完成作业,我希望能够返回具有新总成绩的对象A /主页面,而无需创建新的对象A.

  • 让您的主要班级A持有用户与之互动的B的集合,例如ArrayList<B>。每当创建并显示新的B对象时,将其添加到上面的列表中,这将允许A在需要时迭代列表,允许它查询每个B的状态。
  • 为B提供状态状态,例如枚举BState,其值可能为INITIALIZEDSTARTEDCOMPLETED,并为B提供带有getter和setter的BState变量。这样,A可以遍历列表并查看已完成的内容。
  • B的可视化部分,它的&#39; &#34;视图&#34;应该基于创建JPanel。通过这种方式,您可以以任意多种方式显示它,例如在自己的JDialog中,在JOptionPane中或我最喜欢的方式,使用CardLayout在A内部交换。
  • 如果A需要跟踪或响应B是否完成了分配,那么将BState变量设为&#34;绑定属性&#34;通过给B一个SwingPropertyStateSupport字段和一个addPropertyChangeListener(...)方法,将这些监听器添加到支持对象。然后,当B的BState发生变化时,它可以通知所有听众。

你问:

  

在没有实例化新的Object A并将结果传递给构造函数的情况下,是否仍然可以这样做?或者这是最好的方法?我很好奇,因为不会实例化两个相同类型的对象是浪费吗?

  • 无论你做什么,都不要创建另一个&#34;对象A&#34; 。不要考虑这样做,因为它会创建一个新的独特的对象A,其状态对原始对象A&#34;
  • 没有影响。

答案 2 :(得分:0)

当对象A实例化对象B时,它可以将自身作为参数之一传递给构造函数。

当对象B完成任务时 - 它可以调用对象A上的方法,告诉它可以继续。

class A {

     void objectBisDone() {
         //....
     }

     void createObjB() {
         B b = new B(this); // <-- pass itself to B's constructor
         b.run();
     }
}

class B {

    A myA;

    B(A a) {myA = a;} // save A as a member

    void run() {
        // ...
        // and when B is done
        myA.objectBisDone();

    }
}

答案 3 :(得分:0)

在OOP中,一个抽象应公开的任何信息都应该通过公共getter方法。我的意思是:在B类中提供尽可能多的get *方法,以便对象A可以调用它们。