使用JavaBeans在类之间传递数据

时间:2015-03-19 21:44:31

标签: java javabeans

一条重要信息:这些类都是单独的文件,总共有大约10个bean。

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

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

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

有人能指出我正确的方向还是举个例子。 感谢

修改

Bean class snippet;

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");

下注的班级是"得到",class2

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

这就是我如何使用bean而且它们不能按照我的要求工作。

3 个答案:

答案 0 :(得分:2)

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

有多种方法可以解决这个问题,这取决于您的应用程序。但是,我建议一个通用的解决方案。

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

答案 1 :(得分:1)

容器我对你的问题感到非常困惑。您指的是Enterprise Java Bean吗?

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

除此之外,如果你的班级生活在同一个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是该类的属性,因此它的实例将具有自己的值。

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

这就是Class的意思。您可以指定该类的实例(实际对象)的属性(实例变量)和行为(方法)。

如果要共享信息,则需要一种方法将(!)类的实例(对象)传递给其他实例。在Java中存在不同的方式。你可以使用全局的静态变量(绑定到Class而不是类的实例),你可以使用singleton模式(它使用静态变量),你可以使用ThreadLocal(一个局限于当前线程的全局存储),您可以使用存储对象的管理器/存储库并传递管理器/存储库对象,您可以使用数据库,也可以使用依赖注入器,它类似于透明对象管理器。基本上就是这些。

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

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会有一些缺点。

答案 2 :(得分:0)

如果您要对类进行序列化/反序列化,请确保

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

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

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

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

  5. 事情应该起作用;)