如何使用参数化构造函数为类创建对象?

时间:2012-02-25 08:16:15

标签: java class object constructor

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 个答案:

答案 0 :(得分:3)

这可以使用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

虽然有些人可能会争辩[总是]使用" getters",因为这是一个[简单] 不可变对象,我发现它(直接成员访问)是一种有效的方法。然而,一个非常好的事情" getters"是它们可以在接口中定义,因为它们实际上只是方法。这个方便的功能可以用于避免以后的ABI破坏性更改,或启用DI,或允许嘲笑......但不要过度设计:)

(我通常会避免" setter"除非绝对需要......不需要随意引入可变状态,如果需要改变状态,我喜欢通过"动作&#来改变它34。)

快乐的编码。


现在,假设这个问题是关于删除静态工厂方法,同时仍然保留最终成员,那么它仍然可以简单地完成(但是,这会引入一个可以抛出的"构造函数一个例外")这是一个完全不同的蠕虫...无论如何,请注意,在构造函数中分配给最终成员的要求仍然是满的。

// 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;
}