Используйте JavaBeans для передачи данных между классами

1

Кусок важной информации: классы - это все отдельные файлы, и всего около 10 бобов.

Я работаю над проектом с несколькими классами, через которые должны передаваться данные. Т.е. пара слов из класса Class1 должна быть доступна в Class2.

Моя программа использует JavaBeans с методами set и get, но если я устанавливаю компонент в одном классе и пытаюсь получить эти данные в другом классе, я просто получаю возвращаемое значение null.

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

Может ли кто-нибудь указать мне в правильном направлении или привести пример. благодаря

редактировать

Фрагмент класса Bean;

public class beans implements java.io.Serializable {



private String string1;


public String getstring1() {

    return this.string1;
}

public void setstring1(String string1) {
    this.string1 = string1;
}

И код установщика в say class1:

beans bean = new beans();   
bean.setstring1("test");

И класс, где ставка "досталась", класс2

beans bean = new beans(); String text = bean.getstring1();

Это в значительной степени то, как я использую бобы, и они не работают так, как я их хочу.

  • 0
    Кстати, мой класс сериализуем, то есть общедоступные классы реализуют java.io.Serializable {
  • 0
    Не могли бы вы опубликовать MCVE
Теги:
javabeans

3 ответа

1
Лучший ответ

контейнер. Я очень озадачен вашим вопросом. Вы имеете в виду Enterprise Java Beans?

Если вы просто означаете, что обычные JavaBeans просто используют методы get и set, первое, что я бы посоветовал, - это научиться использовать jUnit. Сначала проверьте свой компонент данных, чтобы убедиться, что он работает по назначению.

Кроме того, если ваш класс живет в одной и той же JVA (вы запускаете только один java.exe/запускаете одно приложение), все должно работать нормально.

public class Data { 
    private String value; 
    public void set(String value) { this.value = value; }
    public String get() { return this.value; }
}

public class ClassA {
    Data data = new Data();
    ClassA() { data.set("From ClassA"); }
}

public class ClassB {
    Data data;
    ClassB(Data data) { this.data = data; }
    public void print() {
      System.out.println(data.get());
    }
}

public static void main(String args []) {
    new ClassB(new ClassA().data).println();
}

Это простой пример использования объекта данных для передачи информации вокруг.

Надеюсь, это то, что вы хотите знать.

[Обновить]

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

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

То, что Класс означает. Вы указываете свойства (переменные экземпляра) и поведение (методы) экземпляров (фактического объекта) этого класса.

Если вы хотите обмениваться информацией, вам нужен способ передать (!) Экземпляр (объект) класса другим экземплярам. В Java существуют разные способы. Вы можете использовать статические переменные, которые являются глобальными (привязаны к классу вместо экземпляра класса), вы можете использовать singleton pattern (который использует статическую переменную), вы можете использовать ThreadLocal (глобальный магазин, ограниченный текущим потоком), вы можете использовать управляющие/хранилища, хранящие объекты, и вы передаете объекты менеджера/хранилища, вы можете использовать базы данных или использовать инжектор зависимостей, который похож на прозрачный диспетчер объектов. Это в основном это.

Для вашего случая использования я сначала использовал Синглтон.

public class MySingleton {
   private static Bean myBean;
   public static void setBean(Bean myBean) { MySingleton.myBean = myBean; }
   public static Bean getBean() { return myBean; }
}

Использование класса прямолинейно:

Bean bean = new Bean();
bean.setString1("test");
MySingleton.setBean(bean);
Bean bean2 = MySingleton.getBean();
System.out.println(bean2.getString1()); //prints test

Но будьте осторожны, это ленивый способ делать что-то. Использование static имеет некоторые обратные поддержки, если у вас есть сложный проект, особенно когда речь идет о сериализации, параллелизме и повторном использовании.

  • 0
    Я пытаюсь получить данные в публичной статической пустоте в ClassB
  • 0
    Если я попытаюсь использовать ваш второй пример с тремя файлами classe Main, Bean и MySingleton и попробую запустить класс Main, содержащий ваш последний фрагмент кода, я получу следующую ошибку:
Показать ещё 3 комментария
2

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

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

Вы можете создать BeanRepository который отвечает за ссылки на все объекты bean. Затем другим классам необходимо знать id компонента, и они могут получить ссылку.

BeanRepository (обратите внимание на статические методы):

public class BeanRepository {
    private static Map<Integer, Bean> beanMap = new HashMap<Integer, Bean>();

    public static void putBean(int id, Bean bean) {
        beanMap.put(id, bean);
    }

    public static Bean getBean(int id) {
        return beanMap.get(id);
    }
}

Боб:

public class Bean {
    private String name;

    public Bean(String name) {
        this.name = name;
    }

    public String whoAmI() {
        return name;
    }
}

Классы A и B:

public class ClassA {
    private Bean bean;

    public ClassA(int beanId) {
        this.bean = BeanRepository.getBean(beanId);
    }

    public void test() {
        System.out.println("I am ClassA. You are " + bean.whoAmI());
    }
}

public class ClassB {
    private Bean bean;

    public ClassB(int beanId) {
        this.bean = BeanRepository.getBean(beanId);
    }

    public void test() {
        System.out.println("I am ClassB. You are " + bean.whoAmI());
    }
}

Метод испытания:

public class Main {
    public static void main(String[] args) {
        BeanRepository.putBean(1, new Bean("one"));

        ClassA a = new ClassA(1);
        ClassB b = new ClassB(1);

        a.test();
        b.test();
    }
}
  • 0
    Также я не вижу, как вы определяете каждый отдельный бин, скажем, например, в классе я хочу установить бины FirstName и LastName и в Главной угрозе в классе B я хочу напечатать их
  • 0
    Так может быть несколько бинов в классе бинов?
0

Если вы сериализуете/десериализируете свои классы, убедитесь, что

  1. сами поля нитей не отмечены как переходные.

  2. вы не используете собственные методы writeObject (ObjectOutputStream) в своем объекте, где вы забыли свои строковые поля.

  3. вы не клонируете свой класс с помощью специальных методов clone(), в которых вы забыли свое поле строки

  4. вы в первую очередь написали сеттер и геттер.

и вещи, которые работают;)

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню