Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/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_Oop - Fatal编程技术网

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

如何从Java中的另一个对象返回调用对象?,java,oop,Java,Oop,对象A实例化对象B 在用户与对象B交互之后,我想返回到对象A 因为对象A需要使用对象B中用户确定的结果。用户回答对象B中的问题 在不实例化新对象a并将结果传递给构造函数的情况下,是否仍可以这样做?还是这是最好的方法?我很好奇,因为实例化两个相同类型的对象不是很浪费吗 我不想使用内部类,因为除了保持对象简短之外,我还希望其他对象能够使用赋值类。 //对象A==主页面 //Homework 1 if(e.getSource()==task[0]){ try {

对象A实例化对象B

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

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

我不想使用内部类,因为除了保持对象简短之外,我还希望其他对象能够使用赋值类。 //对象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


我不想使用内部类,因为我还有其他页面也希望使用赋值类

当对象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();

    }
}
A类{
void objectBisDone(){
//....
}
void createObjB(){

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

使用回调,类似于:

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();
    }
 }
一些想法:

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

  • 让您的主类A保存用户与之交互的B的集合,例如
    ArrayList
    。每当创建和显示新的B对象时,将其添加到上面的列表中,这将允许A在需要时遍历列表,允许A查询每个B的状态
  • 给B一个状态状态,比如enum
    BState
    ,它可能有
    初始化的
    开始的
    完成的
    ,给B一个带有getter和setter的BState变量。这样a就可以遍历列表,查看哪些已经完成了
  • B的可视化部分,即它的“视图”应该以创建JPanel为基础。通过这种方式,您可以以多种方式显示它,例如在它自己的JDialog、JOptionPane或我的最爱中,使用CardLayout在内部交换
  • 如果A需要跟踪或响应B是否已完成分配,则通过给B一个SwingPropertyStateSupport字段和一个
    addPropertyChangeListener(…)使
    BState
    变量成为“绑定属性”
    方法,该方法将这些侦听器添加到支持对象中。然后,当B的B状态更改时,它可以通知任何和所有侦听器
你问:

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

    不管你做什么,<强>不要创建另一个“对象A”<强>。甚至不要考虑这样做,因为它会创建一个新的和不同的对象A,一个状态对原来的“对象A”没有影响。
我不确定我是否正确理解了您的问题,但我怀疑您可能对内部类感兴趣。我尝试不使用内部类,因为对象A可以实例化对象B、C、D、E、F、G……因此我试图尽量减少所需的行数。这是一个措辞非常模糊的问题。您已经得到了所有答案和建议总而言之,你能更具体地描述你的用例吗?这是Swing吗?一个web应用程序?A和B之间的关系是什么(除了A和B之外)?一点代码,甚至是伪代码,都会很有帮助。是的,我猜他/她需要这些。这听起来像是我要找的信息。我将阅读SwingPropertyStateSupport字段和枚举类型。对于这些含糊不清的内容,我深表歉意,并感谢您的帮助。@alison:不客气,谢谢您改进这个问题。请注意Swing components已经提供了默认的属性更改支持以及
addPropertyChangeListener(…)
和相应的删除方法,这使您更容易实现。