Как создать объект для класса только с параметризованным конструктором? - PullRequest
1 голос
/ 25 февраля 2012
public final class City
{
public final long id;

public final String name;

public final double latitude;

public final double longitude;

public City(long id, String name, double lat, double lng)
{
    this.id = id;
    this.name = name;
    this.latitude = lat;
    this.longitude = lng;
}

public static City fromJsonObject(JSONObject json) throws JSONException
{
    return new City(json.getLong(WebApi.Params.CITY_ID),
            json.getString(WebApi.Params.CITY_NAME),
            json.getDouble(WebApi.Params.LATITUDE),
            json.getDouble(WebApi.Params.LONGITUDE));
}
}

Это мой класс.Я хочу получить доступ к значениям этого класса в моем другом классе;Как я могу это сделать?(значение широты, долготы, названия города и города)

1 Ответ

3 голосов
/ 25 февраля 2012

Это можно сделать с помощью записи 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...