簡體   English   中英

使用JavaBeans在類之間傳遞數據

[英]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會有一些缺點。

如果你序列化/反序列化你的類,請確保

  1. 字符串字段本身未標記為瞬態。

  2. 您沒有在您忘記字符串字段的對象中使用自定義writeObject(ObjectOutputStream)方法。

  3. 您沒有使用自定義clone()方法克隆您的類,而您忘記了字符串字段

  4. 你首先正確地寫了setter和getter。

和事情應該工作;)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM