我想知道通过对webservices的请求来初始化我的模型是好还是坏,或者更好地使用在构造函数之后调用的另一个公共方法
例如:
class Model {
ModelData data;
Model(Integer model_id) {
data = Request.getDataFromWebServices(model_id);
}
}
答案 0 :(得分:5)
使用必需的构造函数args参数通常是一个很好的方法,以使类正常运行(而不是使用setter)。
因此,如果model_id
必须Model
,model_id
才能正常工作,那么您在那里工作是正确的。
现在您使用Model
进行远程方法调用
远程方法调用可能需要更长时间才能执行,这使得Model
需要更多时间进行初始化,并且可能会失败,例如由于网络原因。
如果api涵盖来自网络层或实际处理的任何异常,并返回一个好的值来初始化{{1}}然后恕我直言,它应该是正常的。
只需将该类记录为由于网络访问而花费更多时间进行初始化
答案 1 :(得分:4)
问题不在构造函数或其他任何地方使用,问题是使用全局变量。最好通过实例传递request
来显示模型API中的依赖关系:
class Model {
final ModelData data;
Model(Request request, int model_id) {
data = request.getDataFromWebServices(model_id);
}
}
或通过更具描述性的工厂方法创建:
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_id
的有效值。
答案 2 :(得分:1)
这似乎高度依赖于您的个人情况。
我个人可能会将构造函数设为私有,并公开一个名为“CreateModelFromService”之类的公共静态方法,以便让使用我的类的其他人清楚地知道该方法可能会失败的可能性大于正常例如网络连接等等。在实例化看似非网络相关的类时,我通常不会发现这样的错误。
只需我0.02美元
答案 3 :(得分:0)
取决于此组件的使用位置。大多数程序员都希望构造函数能够相当快地完成,因此进行网络操作可能不是最好的选择。
答案 4 :(得分:0)
初始化实例化和以后都是有效的。真正的问题是你要处理什么限制,什么可能在某些时候失败,什么时候你需要访问状态,你将能够处理潜在的延迟等待,直到你需要访问状态来计算状态。除非你的情况需要另一方,否则是对还是错。
答案 5 :(得分:0)
假设您想要对需要其中一个模型类的实例的单元进行单元测试。如何在没有webservice的情况下创建此实例?
使用Web服务创建模型实例可能值得考虑使用factory。这将您的模型与特定的装配机制分开:
class Model {
Model(ModelData data) { ... }
}
class ModelFactory {
private Request request;
Model create(Integer modelId) {
return new Model(request.getDataFromWebServices(modelId));
}
}