2013-02-18 4 views
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 знал, что ему нужно изменить значение или, если возможно. Будем очень благодарны за любые предложения о том, как их изменить. Спасибо!

+0

вопрос остается неясным. можете ли вы пересмотреть свой вопрос? –

+0

Вы пытаетесь подсчитать «выполняемые задачи» с помощью x? Вы должны рассмотреть синхронизацию ... см. Http://www.vogella.com/articles/JavaConcurrency/article.html раздел 3.2 – Fildor

ответ

3

Вам необходимо предоставить экземпляр B экземпляра A. Есть несколько способов сделать это:

  1. Сделать B проистекают из A и сделать поле данных (или аксессор для них) protected в A. Я бы уклонился от этого.

  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(); 
    } 
} 

Теперь, как A и B соединены с TheInterface, но только A соединен с B; B не подключен к A.

+0

... где «changeState» в случае OP будет делать x ++. – Fildor

+1

@Fildor: Спасибо, да. Я отредактировал, чтобы сделать это более ясным (и переместить 'x' обратно в' A'!). –

+0

Я хотел бы также добавить, что x ++ не является атомарным. Я предлагаю использовать 'volatile' или' AtomicInteger', поскольку выше код многопоточен. – Fildor

1

Вы должны расширить класс А внутри класса B, т.е .:

public class B extends A implements Runnable { 
} 

Это устанавливает класса B в качестве подкласса класса A и позволяет получить доступ к его переменным.

+1

Не обязательно. Он мог бы также дать B ссылку на A и установить A set setter/getter для X. – Fildor

+0

True - я просто подумал, что это было самое простое решение (хотя и не обязательно лучшее) –

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)); 
... 
Смежные вопросы