[英]Use JavaBeans to pass data between classes
一條重要信息:這些類都是單獨的文件,總共有大約10個bean。
我正在開發一個包含多個類的項目,通過這些類必須傳遞數據。 即Class1中的幾個字符串必須能夠在Class2中使用。
我的程序使用帶有set和get方法的JavaBeans但是如果我在一個類中設置一個bean並嘗試在另一個類中獲取該數據,我只返回一個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;
}
並且setter代碼在class1中:
beans bean = new beans();
bean.setstring1("test");
並且下注的類別“得到”,class2
beans bean = new beans(); String text = bean.getstring1();
這就是我如何使用bean而且它們不能按照我的要求工作。
在您的示例中,您將在每個類中創建一個新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();
}
}
容器我對你的問題很困惑。 您指的是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類的實例)。 您現在可以為每個人命名。
這是什么類意味着什么。 您可以指定該類的實例(實際對象)的屬性(實例變量)和行為(方法)。
如果要共享信息,則需要一種方法將(!)類的實例(對象)傳遞給其他實例。 在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會有一些缺點。
如果你序列化/反序列化你的類,請確保
字符串字段本身未標記為瞬態。
您沒有在您忘記字符串字段的對象中使用自定義writeObject(ObjectOutputStream)方法。
您沒有使用自定義clone()方法克隆您的類,而您忘記了字符串字段
你首先正確地寫了setter和getter。
和事情應該工作;)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.