2016-11-05 51 views
4

我是Java編程的初學者,目前我正在開發一個具有更復雜的類結構和GUI的應用程序。這可能是一個愚蠢的問題,但它很難谷歌,所以我在這裏問。如何正確實現Java類之間的通信

我有一個主類,看起來像這樣:

package app; 

public class App { 
    private FirstClass fc; 
    private SecondClass sc; 

    public App() { 
     fc = new FirstClass(); 
     sc = new SecondClass(); 

     // ... code continues ... 
    } 
} 

說出二等被此java文件(如GUI形式)的外部定義。有沒有辦法讓我從「sc」實例訪問「fc」實例(或App實例的其他成員變量)(不通過「this」指針)?例如:

class SecondClass { 
    public void someMethod() { 
     getWhoeverCreatedThisInstance().fc.getSomeData(); 

     // ... code continues ... 
    } 
} 

如果不是,我做錯了什麼?我應該設計這個不同嗎?也許設置「fc」爲靜態?但是如果我想讓更多的應用程序的類彼此通信,我應該讓它們全都是靜態的嗎?那麼,什麼是非靜態的東西呢?我可以在「SecondClass」的構造函數中傳遞「App」或「fc」實例的「this」指針,但是當需要這種行爲的類的數量上升時,該解決方案看起來不夠優雅。

任何想法?提前致謝!

+0

你可以更具體的問題嗎?你想只有一個'FirstClass'實例嗎? – Blip

+0

如果您沒有將'App'(又名'this')傳遞給'SecondClass'構造函數,那麼您認爲'getWhoeverCreatedThisInstance()'是如何工作的,因爲'App' *是誰創建的this-實例? – Andreas

+0

@Blip:是的,只需要一個實例。基本上它是像GUI,數據庫連接等類... –

回答

1

我的建議是實現一個帶接口的回調系統。你們每個班級之間的溝通應該實現這些。 這些類應該註冊到創建類。 然後他們可以在創建類中調用一個方法,調用每個註冊類的接口方法並以這種方式傳遞數據。

這SO答案可能幫助 https://stackoverflow.com/a/18279545

0

如果你想開發GUI應用程序,你應該真正進入基本概念。這可能是非常耗時的,但這是必要的,否則你會掩飾奇怪的行爲。我會給你一個基本的理解來回答你的問題。

您認爲簡單的控制檯應用程序,通常有一個線程和傳遞對象是有效的。多線程,這是致命,即使有static變量。每個變量或對象可以同時修改爲,另一個線程可能無法在時間中「看到」更改。這是一件複雜的事情,因爲每個線程都有緩存和單獨的堆棧。總之,fc可能並不總是在Appsc中同步,因此讀取和寫入可能不一致。

現在該做什麼?學習GUI編程的概念。通常你甚至不必爲簡單的事情分享對象。如果GUI控件觸發某個操作,請使用Listener,看看here。例如,如果你想訪問一個數據庫,那麼只需爲每個請求或按鈕點擊一個新的連接對象,無論如何。這很簡單,稍後增加複雜性。

共享對象的一個​​簡單變體是使用​​關鍵字,該關鍵字確保方法或字段一次只能由一個線程訪問。這是一個example。還要看Java提供的線程安全數據結構(java.util.concurrent)。

爲了高級目的,您將有一個單獨的線程,並且您將它們與套接字連接以傳遞消息或數據。