我有两个班级:
public class A{
ArrayList<Runnable> classBList = new ArrayList<Runnable>();
int x = 0;
public A(){
//This code here is in a loop so it gets called a variable number of times
classBList.add(new B());
new Thread(classBList.get(classBList.size())).start();
}
}
public class B implements Runnable{
public B(){
}
public void run(){
//Does some things here. blah blah blah...
x++;
}
}
问题是我需要让B类的实例更改类A中的变量x,即创建类B的类。但是,我不知道如何让B类知道它需要更改价值或是否可以。任何关于如何改变它的建议将不胜感激。谢谢!
答案 0 :(得分:3)
您需要授予B
实例访问A
实例的权限。有几种方法可以做到这一点:
从B
派生A
,并在protected
中为A
制作数据字段(或访问者)B
。我倾向于回避这一点。
让A
在其构造函数中接受B
个实例。
让A
接受在其构造函数中实现某个接口的类的实例,并public TheInterface {
void changeState();
}
public class A implements TheInterface {
ArrayList<Runnable> classBList = new ArrayList<Runnable>();
int x = 0;
public A(){
//This code here is in a loop so it gets called a variable number of times
classBList.add(new B(this)); // <=== Passing in `this` so `B` instance has access to it
new Thread(classBList.get(classBList.size())).start();
}
// Implement the interface
public void changeState() {
// ...the state change here, for instance:
x++;
}
}
public class B implements Runnable{
private TheInterface thing;
public B(TheInterface theThing){
thing = theThing;
}
public void run(){
// Change the thing's state
thing.changeState();
}
}
实现该接口。
您选择的是由您自己决定的。我已经以大致递减的耦合顺序给出它们,其中松散耦合越多(通常)越好。
代码中的第三个选项:
A
现在,B
和TheInterface
都与A
相关联,但只有B
与B
相关联; A
未与{{1}}相关联。
答案 1 :(得分:1)
您需要在B类中扩展A类,即:
public class B extends A implements Runnable {
}
这将Class B设置为A类的子类,并允许它访问其变量。
答案 2 :(得分:1)
您需要让类B
以某种方式了解类A
的哪个实例创建它。
它可以引用其创建者,例如:
public class B implements Runnable{
private A creator;
public B(A a){
creator = a;
}
public void run(){
//Does some things here. blah blah blah...
x++;
}
}
然后在从类A
构建它时传递创建者:
...
classBList.add(new B(this));
...