Это можно сделать с помощью записи instance.member
: (Это похоже на вызов методов, только без скобок; -)
City c = City.fromJsonObject(...);
system.out.println("City name: " + c.name); // etc.
Поскольку элементы помечены final , они должны быть установлены при объявлении или в конструкторе. В этом случае они устанавливаются в конструкторе, который вызывается из фабричного (статического) метода. Однако, поскольку они являются окончательными, это будет недействительным:
City c = ...;
c.name = "Paulville"; // oops (won't compile)! can't assign to final member
Хотя некоторые могут утверждать, что [всегда] использовать «получатели», поскольку это [простой] неизменный объект , я считаю, что (прямой доступ к членам) является правильным подходом. Тем не менее, одна действительно хорошая вещь о "получателях" заключается в том, что они могут быть определены в интерфейсе , поскольку они на самом деле являются просто методами. Эта удобная функция может быть полезной, чтобы избежать последующего изменения ABI, или включить DI, или разрешить насмешку ... но не переусердствовать :)
(Я обычно избегаю «сеттеров», если в этом нет крайней необходимости ... нет необходимости вводить изменяемое состояние произвольно и, если требуется изменение состояния, я бы хотел изменить его с помощью «действий».)
Удачного кодирования.
Теперь, если предположить, что этот вопрос о удалении статического метода фабрики при сохранении конечных элементов, то это все равно можно сделать тривиально (однако, тогда вводится «конструктор, который может вызвать исключение») это совсем другая банка червей ... в любом случае, обратите внимание, что требование назначения конечных членов в конструкторе все еще выполняется.
// constructors can (ickickly) throw exceptions ...
public City(JSONObject json) throws JSONException
{
id = json.getLong(WebApi.Params.CITY_ID),
name = json.getString(WebApi.Params.CITY_NAME),
latitude = json.getDouble(WebApi.Params.LATITUDE),
longitude = json.getDouble(WebApi.Params.LONGITUDE));
}
Или, возможно, желательно сохранить / использовать фабричный метод, также обеспечивая перегрузку конструктора, но это действительно начинает глупо ...
public City(JSONObject json) throws JSONException
: this(City.fromJsonObject(json)) {
// we do everything in the next constructor, it would be neat if it
// was possible to do static/local stuff before calling the base constructor
// (so that we could pass in multiple arguments, but .. not possible in Java)
}
City(City other) {
// a "copy constructor"
// just copy over the member values, note no exception from here :)
// also note that this fulfills the contract of assigning to the final
// members when used as the base constructor for City(JSONObject)
id = other.id;
name = other.name;
latitude = other.latitude;
longitude = other.longitude;
}