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