0

我有两个这样的课程:

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 类的实例更改创建类 B 的类 A 中的变量 x。但是,我不知道如何让 B 类知道它需要更改值,或者如果它可以。任何有关如何更改它的建议将不胜感激。谢谢!

4

3 回答 3

3

您需要授予您的B实例访问该A实例的权限。有几种方法可以做到这一点:

  1. B从. _ A_ _ 我倾向于回避这个。protectedA

  2. 在其构造函数中B接受一个A实例。

  3. 接受在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();
    }
}

现在,两者AB都耦合到TheInterface,但仅A耦合到B; B不耦合到A

于 2013-02-18T09:09:42.750 回答
1

您需要在 B 类中扩展 A 类,即:

public class B extends A implements Runnable {
}

这将 B 类设置为 A 类的子类,并允许它访问其变量。

于 2013-02-18T09:06:32.610 回答
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));
...
于 2013-02-18T09:10:41.510 回答