2015-08-28 6 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(); 
} 

Теперь, я хотел бы иметь реализацию на основе работающей платформы. Каков хороший способ сделать это? Нужно ли загружать классы во время выполнения?

Если я создаю два класса, реализующих этот интерфейс (SerialPortUnix и SerialPortWin32). Я хочу иметь функцию, которая вернет ту или иную платформу.

Как я могу это сделать правильно?

Спасибо,

+0

альтернативу шаблону фабрики и время выполнения разрешение реализации будет использовать рамки инъекции зависимостей (например, Spring) с различными профилей/сборок для разных операционных систем, то есть вы будете создавать различные артефакты для разных операционных систем. –

+0

Какое преимущество такого решения? Это кажется сложным. –

+0

он, например, лучше подходит для принципа open-close (https://en.wikipedia.org/wiki/Open/closed_principle), поскольку вам не нужно изменять конструкцию 'if-else' всякий раз, когда вы хотите добавить новую ОС поддержка. –

ответ

4

Реализовать различные SerialPort экземпляры для различных платформ. Предположим, мы имеем SerialPort реализации: serialPortWindows для Windows, и для Linux serialPortLinux

Затем используйте System.getProperty("os.name"); вызов, чтобы определить платформу и использовать соответствующий класс.

Если ваше приложение работает либо на окнах или 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

Было бы целесообразно использовать шаблон Factory здесь? – Sid

+2

да, конечно. Этот код может (и должен) быть реорганизован в соответствии с текущей конкретной задачей. Это простой/грязный пример, как решить задачу в целом. –

+0

Где я могу поставить заводской метод? Я не могу использовать статический метод в моем интерфейсе SerialPort. Должен ли я создать класс SerialPortFactory? –