Следующая структура широко используется в JavaFX:
class A {
// Private inner property
private ObjectProperty<X> objx;
// Public property accessor method
public final ObjectProperty<X> objxProperty() {
if (objx == null)
objx = new SimpleObjectProperty<X>(DEFAULT_VALUE);
return objx;
}
// Public setter method
public final void setObjx(X val) {
objxProperty().set(val);
}
// Public getter method
public final X getObjx() {return objx == null ? DEFAULT_VALUE : objx.get();}
}
То, что вы можете увидеть здесь называется lazy initialization. Фокус в том, что частное внутреннее свойство не инициализируется до тех пор, пока оно (действительно) не будет запрошено.
Приобретение общественной собственности objxProperty()
будет инициализировать частную внутреннюю собственность objx
. Этот метод доступа к ресурсам используется для отображения внутреннего свойства для привязки и прослушивания. Частное внутреннее свойство получает суффикс «Свойство», который можно рассматривать как соглашение в JavaFX.
Общепринятый метод настройки setObjx
использует этот метод доступа к свойству, поэтому в случае запроса установить значение этого свойства, внутреннее свойство будет инициализировано.
Это немного отличается в случае публичного getter getObjx()
, как если бы внутреннее свойство еще не инициализировалось (нет запроса прямого доступа к этому свойству и никакого заданного запроса до этого), значение по умолчанию возвращается непосредственно без инициализации внутреннее свойство, дополнительно задерживая процедуру инициализации.
Вы можете увидеть эту технику, например, в случае alignmentProperty
из TextField
в JavaFX.
Если вы не хотите усложнять ситуацию, «стандартный шаблон», объясненный James_D в его ответе, действительно является стандартом (имя метода такое же, как здесь).
Извините, я неправильно прочитал. Я думал, что objxProperty() будет конструктором. Ваш код в порядке. – GhostCat