2016-02-05 1 views
1

Я пишу новое приложение, и я решил использовать Java для гибкости. Это графическое приложение, поэтому я буду использовать JavaFX. Это мой первый опыт использования Java, но у меня есть опыт работы с C#.JavaFX Оберните существующий объект с помощью простых свойств

Я знакомлюсь с JavaFX Properties, они выглядят как отличный способ двунаправленного связывания между интерфейсом и внутренним концом.

В моем коде используются классы из API с открытым исходным кодом, и я хотел бы преобразовать элементы этих классов в свойства JavaFX (String => StringProperty и т. Д.). Я считаю, что это будет прозрачно для любых объектов, которые относятся к этим членам.

В порядке ли это сделать? Является ли это предлагаемым способом работы с существующими классами? Что делать с типами Enum? Например. член перечисления изменил его значение, как мне связать член перечисления с интерфейсом?

Спасибо :)

ответ

4

В общем, до тех пор, пока вы не изменить общественное API класса - другими словами, вы не удалять любые публичные методы, изменять их типы параметров или типы возвращаемых, или изменить их функциональность - вы не должны нарушать код, который их использует.

Так, например, переход от

public class Foo { 

    private String bar ; 

    public String getBar() { 
     return bar ; 
    } 

    public void setBar(String bar) { 
     this.bar = bar ; 
    } 
} 

в

public class Foo { 
    private final StringProperty bar = new SimpleStringProperty(); 

    public StringProperty barProperty() { 
     return bar ; 
    } 

    public String getBar() { 
     return barProperty().get(); 
    } 

    public void setBar(String bar) { 
     barProperty().set(bar); 
    } 
} 

не должны нарушать клиентов класса Foo. Единственная возможная проблема заключается в том, что классы, которые имеют подклассы Foo и переопределены getBar() и/или setBar(...), могут получить неожиданное поведение, если их суперкласс заменен новой реализацией (в частности, если getBar() и setBar(...) не являются окончательными, у вас нет способа обеспечить соблюдение этого getBar()==barProperty().get() , что желательно).

Для перечислений (и других объектов), вы можете использовать ObjectProperty<>:

Учитывая

public enum Option { FIRST_CHOICE, SECOND_CHOICE, THIRD_CHOICE } 

Затем вы можете сделать

public class Foo { 

    private final ObjectProperty<Option> option = new SimpleObjectProperty<>(); 

    public ObjectProperty<Option> optionProperty() { 
     return option ; 
    } 

    public Option getOption() { 
     return optionProperty().get(); 
    } 

    public void setOption(Option choice) { 
     optionProperty().set(choice); 
    } 
} 

Одно предостережение, чтобы все это, что вы ввести зависимость от API JavaFX, который ранее не присутствовал в этих классах. JavaFX поставляется с Oracle JDK, но он не является полной частью JSE (например, он не включен в OpenJDK по умолчанию и не включен в некоторые другие реализации JSE). Поэтому на практике вы вряд ли сможете убедить разработчиков библиотеки с открытым исходным кодом принять ваши изменения в классах в библиотеке. Поскольку это открытый исходный код, вы можете, конечно, сохранить свою собственную вилку библиотеки с свойствами JavaFX, но тогда это будет сложно, если вы хотите включить новые версии этой библиотеки (вам нужно будет объединить два разных набора изменений, по существу) ,

Другой вариант - использовать связанные свойства в классах и обернуть их с помощью Java Bean Property Adapter. Это описано в this question.

+0

Сэр, если вы когда-либо в Сиднее, я куплю вам печенье.Следуйте по вопросу, касающемуся выше, - я прочитал вопрос, к которому вы подключились, и поэтому кажется, что мои варианты: 1) Чтобы заменить типы API свойствами 2) Чтобы реализовать прослушиватели изменений свойств в API. Есть ли способ реализовать любой из них через наследование, чтобы я расширил базовый класс API, а не редактировал его напрямую? Еще раз спасибо за подробный ответ. – mils

Смежные вопросы