【问题标题】:how to create object for a class with only parameterized constructor?如何为只有参数化构造函数的类创建对象?
【发布时间】:2012-02-25 08:16:15
【问题描述】:
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));
}
}

这是我的课。我想在我的另一个类中访问这个类的值;我怎么做? (纬度、经度、cityid和城市名称的值)

【问题讨论】:

  • 你还没有初始化你的最终变量。你的代码是如何编译的??
  • @ShashankKadne 你在哪里看到决赛没有初始化?或者,也许 OP 在您提出问题后编辑了他的构造函数?

标签: java class object constructor


【解决方案1】:

这可以通过使用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”,但由于这是一个[简单的]不可变对象,我发现它(直接成员访问)是一种有效的方法。然而,关于“getter”的一个非常好的事情是它们可以在接口中定义,因为它们实际上只是方法。这个方便的功能可能有助于避免以后发生破坏 ABI 的更改,或启用 DI,或允许模拟......但不要过度设计 :)

(除非绝对需要,否则我通常会避免使用“setter”...无需随意引入可变状态,如果需要更改状态,我喜欢通过“操作”来更改它。)

编码愉快。


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

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

【讨论】:

  • 当我从另一个类访问变量时出现 java.nullpoint 异常。我只想使用这些值。不想修改它们。
  • @Maddy 也许null 是分配的值(分配给name,其他字段不能为空,因为它们是原始类型)?也就是说,getString 可以/是否返回 null?或者它可能根本与这个类无关?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-21
  • 1970-01-01
相关资源
最近更新 更多