2015-08-28 50 views
1

我正在用Java編寫一個串行接口。它使用JNA來訪問底層本機API。 I'have定義包含經典的方法(打開,讀,寫,關閉...)一SerialPort接口:如何在Java中擁有平臺類?

public interface SerialPort { 
    void open(String portName) throws IOException; 
    void close() throws IOException; 
    void write(byte[] data) throws IOException; 
    byte[] read(int bytes) throws IOException; 
    byte[] read(int bytes, int timeout) throws IOException; 
    void setConfig(SerialConfig config) throws Exception; 
    SerialConfig getConfig(); 
} 

現在,我想根據運行的平臺上有落實。有什麼好辦法做到這一點?我需要在運行時加載類嗎?

如果我創建兩個類實現此接口(SerialPortUnixSerialPortWin32)。我想有一個功能,可以基於平臺返回一個或另一個。

我該如何正確地做到這一點?

感謝,

+0

替代工廠模式和運行時執行決議將是使用依賴注入框架(如春季)與不同配置文件/構建不同的操作系統,即您將爲不同的操作系統生成不同的工件。 –

+0

這種解決方案的優勢是什麼?看起來很複雜。 –

+0

它比較適合開放關閉原則(https://en.wikipedia.org/wiki/Open/closed_principle),因爲無論何時您想添加新的操作系統,您都不需要修改「if-else」構造支持。 –

回答

4

實現不同平臺SerialPort實例。假設我們有SerialPort實現:serialPortWindows for Windows,和serialPortLinux for Linux

然後使用System.getProperty("os.name");調用來確定平臺並使用相關類。

如果您的應用程序運行遠程安裝Windows或Linux,嘗試這個例子:

String os = System.getProperty("os.name").toLowerCase(); 
SerialPort serialPortImpl; 
if (os.substring("windows") != -1) { 
    // use windows serial port class 
    serialPortImpl = serialPortWindows; 
} else { 
    // use linux serial port class 
    serialPortImpl = serialPortLinux;  
} 

// now use serialPortImpl, it contains relevant implementation 
// according to the current operating system 
+0

這裏建議使用工廠模式嗎? – Sid

+2

是的,當然。此代碼可以(也應該)根據當前的特定任務進行重構。這是一個簡單/骯髒的例子,如何解決一般的任務。 –

+0

我可以在哪裏放工廠方法?我不能在我的SerialPort接口中使用靜態方法。我應該創建一個SerialPortFactory類嗎? –

相關問題