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