使用 JavaBeans 在 类 之间传递数据

Use JavaBeans to pass data between classes

一条重要信息:classes都是独立的文件,总共有10个bean左右。

我正在处理一个包含多个 classes 的项目,数据必须通过这些 es 传递。 IE。来自 Class1 的几个字符串必须能够在 Class2 中使用。

我的程序使用带有 set 和 get 方法的 JavaBeans,但是如果我在一个 class 中设置一个 bean 并尝试在另一个 class 中获取该数据,我只会返回一个空值。

我不确定最好的方法是什么,我已经很好地定义了 bean,并且想继续使用它们,但我不知道如何使用。

有人能给我指出正确的方向或举个例子吗? 谢谢

编辑

Bean class 片段;

public class beans implements java.io.Serializable {



private String string1;


public String getstring1() {

    return this.string1;
}

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

而 setter 中的代码 class1:

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

而下注的 class "got", class2

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

这几乎就是我使用这些 bean 的方式,但它们并没有像我希望的那样工作。

如果您是 serializing/deserializing 您的 class,请确保

  1. 字符串字段本身未标记为瞬态。

  2. 您没有在忘记字符串字段的对象中使用自定义 writeObject(ObjectOutputStream) 方法。

  3. 您没有使用自定义的 clone() 方法克隆您的 class,而您忘记了您的字符串字段

  4. 你首先正确地写了 setter 和 getter。

一切都应该有效 ;)

container 你的问题我很疑惑。您指的是 Enterprise Java Beans 吗?

如果您只是指普通的 JavaBean 仅具有 get 和 set 方法,我建议的第一件事是学习如何使用 jUnit。首先测试您的数据 bean 以确保它按预期工作。

除此之外,如果您的 class 位于同一个 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();
}

这是一个使用数据对象传递信息的简单示例。

希望这就是你想知道的。

[更新]

添加一些代码后我发现了问题。正如其他用户已经写过的那样,您每次都在创建新对象(实例)。由于 string1 是那个 class 的 属性,因此它的每个实例都有自己的值。

默认示例是一个人。使用 属性 名称(类似于您的 string1)创建一个人 class,您可以创建两个人(class 人的实例)。您现在可以为每个人命名。

这就是 Class 的意思。您指定 class.

的实例(实际对象)的属性(实例变量)和行为(方法)

如果您想共享信息,您需要一种方法将 Class 的一个实例(对象)传递(!)到其他实例。在 Java 中存在不同的方式。您可以使用全局静态变量(绑定到 Class 而不是 class 的实例),您可以使用单例模式(使用静态变量),您可以使用 ThreadLocal(全局变量) store limited to the current thread),你可以使用管理器/存储库存储对象并传递管理器/存储库对象,你可以使用数据库或者你可以使用依赖注入器,它就像一个透明的对象管理器。基本上就这些了。

对于您的用例,我会首先使用 Singleton。

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

使用 class 很简单:

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

但请注意这是懒惰的做事方式。如果您有一个复杂的项目,尤其是在序列化、并发和重用方面,使用静态会有一些缺点。

在您的示例中,您在每个 class 中创建了一个新 bean。第一个和第二个 class 引用了两个不同的对象,这就是为什么它们不能访问相同的值。

有多种方法可以解决这个问题,具体取决于您的应用程序。但让我提出一个通用的解决方案。

您可以创建一个 BeanRepository 来负责对所有 bean 对象的引用。然后其他 classes 需要知道 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;
    }
}

类甲乙:

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