一条重要信息:这些类都是单独的文件,总共有大约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而且它们不能按照我的要求工作。
答案 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)
如果您要对类进行序列化/反序列化,请确保
字符串字段本身未标记为瞬态。
您在对象中没有使用自定义writeObject(ObjectOutputStream)方法,忘记了字符串字段。
您没有使用自定义clone()方法克隆您的类,忘记了字符串字段
你首先正确地写了setter和getter。
事情应该起作用;)