使用 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,请确保
字符串字段本身未标记为瞬态。
您没有在忘记字符串字段的对象中使用自定义 writeObject(ObjectOutputStream) 方法。
您没有使用自定义的 clone() 方法克隆您的 class,而您忘记了您的字符串字段
你首先正确地写了 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();
}
}
一条重要信息: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,请确保
字符串字段本身未标记为瞬态。
您没有在忘记字符串字段的对象中使用自定义 writeObject(ObjectOutputStream) 方法。
您没有使用自定义的 clone() 方法克隆您的 class,而您忘记了您的字符串字段
你首先正确地写了 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();
}
}