Java 好或坏-使用构造函数从远程Web服务初始化模型

Java 好或坏-使用构造函数从远程Web服务初始化模型,java,object,constructor,Java,Object,Constructor,我想知道通过对webservices的请求来初始化我的模型是好是坏,还是使用在构造函数之后调用的另一个公共方法更好 例如: class Model { ModelData data; Model(Integer model_id) { data = Request.getDataFromWebServices(model_id); } } 看起来这在很大程度上取决于你的个人情况 我个人可能会将构造函数设置为私有,并公开一个名为“CreateModelFr

我想知道通过对webservices的请求来初始化我的模型是好是坏,还是使用在构造函数之后调用的另一个公共方法更好

例如:

class Model {
    ModelData data;

    Model(Integer model_id) {
       data = Request.getDataFromWebServices(model_id);
    }
}

看起来这在很大程度上取决于你的个人情况

我个人可能会将构造函数设置为私有,并公开一个名为“CreateModelFromService”的公共静态方法,以向使用我的类的其他人明确说明,由于网络连接等原因,该方法失败的可能性比正常情况大,在实例化一个看似与网络无关的类时,我通常不会想到会出现这样的错误


仅我的$0.02取决于此组件的使用位置。大多数程序员希望构造器能够相当快地完成,所以网络操作可能不是最好的主意

实例化时初始化和以后初始化都有效。真正的问题是你在处理什么限制,什么可能会在某个时候失败,你什么时候需要访问状态,你是否能够处理一个潜在的延迟,直到你需要访问状态来计算状态。除非您的情况需要另一个参数,否则两者都不是对的或错的。

通常,将类功能所需的构造函数参数用作构造函数参数(而不是使用setter)是一种很好的方法。
因此,在您的情况下,如果
model\u id
对于
model
的工作是必需的,那么您在那里就可以了。
现在您可以使用
model\u id
进行远程方法调用。
远程方法调用可能需要更多的时间来执行,使得
Model
需要更多的时间来初始化,并且可能会失败,例如由于网络原因。
如果api涵盖了来自网络层或实际处理的任何异常,并且返回了一个良好的值来初始化
模型
,那么它应该是正常的。

只需将该类记录为由于网络访问而需要更多时间进行初始化

假设您想要对需要一个模型类实例的某个对象进行单元测试。如果没有webservice,您将如何创建此实例

可能值得考虑使用Web服务创建模型实例。这会将您的模型与特定的装配机制分离:

class Model {
    Model(ModelData data) { ... }
}

class ModelFactory {
    private Request request;

    Model create(Integer modelId) { 
        return new Model(request.getDataFromWebServices(modelId));
    }    
}

问题不是在构造函数或其他任何地方使用,而是使用全局变量。最好通过实例传递
请求
,以显示模型API中的依赖关系:

class Model {
  final ModelData data;

  Model(Request request, int model_id) {
    data = request.getDataFromWebServices(model_id);
  }
}
或通过更具描述性的factory方法创建:

class Model {
  static Model createModelFromWebServices(Request request, int model_id) {
    return new Model(request.getDataFromWebServices(model_id));
  }

  final ModelData data;

  Model(ModelData data) {
    this.data = data;
  }
}

我使用原语
int
而不是
Integer
,因为我想知道
null
不是
model\u id

+1的有效值,因为我没有考虑“Request”的问题。但总是可以使用ModelRequest扩展模型,no?-1工厂不是解决此问题的合适模式。