Как обмениваться данными между отдельными классами в Java - PullRequest
9 голосов
/ 12 декабря 2010

Каков наилучший способ обмена данными между отдельными классами в Java?У меня есть куча переменных, которые используются разными классами в разных файлах по-разному.Позвольте мне попытаться проиллюстрировать упрощенную версию моей проблемы:

Это был мой код раньше:

public class Top_Level_Class(){
    int x, y;

    // gets user input which changes x, y;
    public void main(){
       int p, q, r, s;
       // compute p, q, r, s
       doA(p,q,r);
       doB(q,r,s);
    }

    public void doA(int p, int q, int r){
       // do something that requires x,y and p, q, r
    }

    public void doB(int q, int r, int s){
       // does something else that requires x, y and q, r, s
    }
}

Теперь это выглядит примерно так:

public class Top_Level_Class(){
    int x, y;
    SomeClass1a a = new SomeClass1a();
    SomeClass1a b = new SomeClass1b();
    // gets user input which changes x, y;
    public void main(){
       int p, q, r, s;
       // compute p, q, r, s
       a.doA(p,q,r);
       b.doB(q,r,s);
    }

public class SomeClass1a() {  // in its own separate file
    public void doA(int p, int q, int r){
       // do something that requires x,y and p, q, r
    }
}


public class SomeClass1b() {  // in its own separate file
    public void doB(int q, int r, int s){
       // does something else that requires x, y and q, r, s
    }
}

Итакв любом случае, должен ли я каждый раз передавать x и y (где x, y - переменные, хранящиеся в классе помощника func)?

 a.set(x,y);
 a.doA(p,q,r);

Моя идея заключалась в том, чтобы иметь специальный контейнерный класс, в котором содержатся x и y.Класс верхнего уровня будет иметь экземпляр класса контейнера и изменять x, y с помощью методов set.

// in the top level class:
Container c = new Container(x,y);
a.setContainer(c);
b.setContainer(c);

Мои вспомогательные классы также будут иметь экземпляр контейнера, и он будет указывать на тот же экземпляр, что и на верхнем уровне.Таким образом они получают доступ к тому же x, y, что и на верхнем уровне.

Я хотел бы знать, должен ли я

  • Использовать класс контейнера
  • Загрузить x, у каждый раз в подклассы
  • ??Какой-то лучший метод ??

Ответы [ 4 ]

13 голосов
/ 14 декабря 2010

Полагаю, ответом на ваш вопрос является шаблон проектирования под названием Singleton.По сути, он позволяет вам получать и использовать один и тот же (и уникальный) экземпляр класса, когда вы хотите в своей системе.

Это его реализация (прошу прощения за возможные синтаксические ошибки, я его не компилировал):

class Container{

  //eventually provides setters and getters
  public float x;
  public float y;
  //------------

  private static Container instance = null;
  private void Container(){

  }
  public static Container getInstance(){
    if(instance==null){
       instance = new Container();
      }
      return instance;
  }
}

тогда, если в другом месте вашего кода вы импортируете Контейнер, вы можете написать, например,

Container.getInstance().x = 3;
temp = Container.getInstance().x;

, и вы будете влиять на атрибуты уникального экземпляра контейнера, который есть в вашей системе

Однако во многих случаях лучше использовать шаблон инжекции зависимостей, поскольку он уменьшает связь между различными компонентами.

0 голосов
/ 12 декабря 2010

Blockquote Основная причина, по которой я не хотел каждый раз передавать x, y, заключается в том, что у меня есть несколько функций в нескольких подклассах, которые каждый использует (x, y, z и т. Д.), И это, похоже, не правильнов 6-8 переменных каждый раз, когда я вызываю функцию.Подклассы были зависимыми, но я пытаюсь извлечь их из файла, чтобы их можно было использовать в другом проекте.Цитата

Если это так, то вам лучше абстрагировать ваши переменные в класс контейнера.Если каждый экземпляр этих уже не зависимых классов будет использовать большое подмножество этих переменных, то имеет смысл иметь их все в одном экземпляре.Переменные, которые логически связаны, должны быть найдены там же.Ваш подход должен выглядеть примерно так:

public class Top_Level_Class(){
Container container = new Container(x, y, p, q, r, s);
SubClass1a a = new SubClass1a(container);
SubClass1a b = new SubClass1b(container);
// gets user input which changes x, y using container's getters and setters
public void main(){
   // compute and set p, q, r, s
   a.doA();
   b.doB();
}

public class SubClass1a(Container c) {  // in its own separate file
    public void doA(c.getX, c.getY, c.getP, c.getQ, c.getR){
       // do something that requires x, y, p, q, and r
    }
}

public class SubClass1b(Container c) {  // in its own separate file

    public void doB(c.getX, c.getY, c.getQ, c.getR, c.getS){
       // does something else that requires x, y, q, r, and s
    }
}

public class Container(x, y, p, q, r, s) {
    //getters and setters for all variables
}

Это удерживает вас от попадания в переменную ситуацию с передачей спагетти-кода, и когда вы захотите использовать один или два из этих классов позже, ваш код будет достаточно модульным, чтобыпорт только с этими классами и вашим контейнером.

0 голосов
/ 12 декабря 2010

Этот вопрос немного сумасшедший - код в вопросе не скомпилируется.

public class Main {
    public static void main(String... args) {
        MutableDataContainer m = new MutableDataContainer();
        ImmutableDataContainer i = computeImmutableData();
        new ADoer().doA(m, i);
        new BDoer().doB(m, i);
    }
    ...
}

class MutableDataContainer {
    private int x, y;
    ... // getters and setters below
}

class ImmutableDataContainer {
    private final int p, q, r, s;
    ... // getters below
}

Вам также нужно определить ADoer и BDoer.

0 голосов
/ 12 декабря 2010

Мне трудно понять, в чем ваша проблема - почему вы не хотите передать x a y в качестве параметра?

О, хорошо.Предполагая, что вы этого не сделаете, я не вижу необходимости в новом классе контейнера.Сделайте это следующим образом:

public class SubClass1a() {  // in its own separate file
    public void doA(Top_Level_Class caller, int p, int q, int r){
       // do something that requires x,y and p, q, r
       // **to get x use the expression term caller.getX() and caller.getY()**
    }
}

Конечно, вам нужно добавить общедоступные методы getX () и getY () в Top_Level_Class.

Если вы не хотите, чтобы SubClass1a зависел отTop_Level_Class, тогда вы можете создать интерфейс, который обеспечивает доступ к переменным.

...