我有一个类Response
,其中包含HTTP响应,其HTTP状态代码如200或404以及其他一些内容,如视图名称和域对象。但是让我们关注状态代码。我可以使用单个类并将状态作为参数传递:
public class Response {
private int status;
public Response(int status) {
this.status = status;
}
}
// in a handler method:
return new Response(HttpStatus.OK);
另一种方法是为每个状态代码创建一个新类(HTTP 1.1中的41个状态代码)。像这样:
public class Ok extends Response {
public Ok() {
super(HttpStatus.OK);
}
}
// in a handler method:
return new Ok();
public class Created extends Response {
public Created() {
super(HttpStatus.CREATED);
}
}
// in a handler method:
return new Created();
实际上通常会有更多参数,例如视图名称和域对象,例如new Response(HttpStatus.OK, "customer", customer)
各自new Ok("customer", customer)
。
答案 0 :(得分:6)
我的建议 1)如果没有与每个状态代码相关联的行为,则不需要新的抽象。 2)使用常量枚举而不是int
答案 1 :(得分:1)
“纯粹”的方式是为每个不同的值设置一个类型,但在实践中这可能是过度的。
一般来说,考虑是否:
有任何独特的处理(适合课程)
实体之间是否存在层次结构(例如,表示成功的状态和表示错误的状态)。
根据我的经验,如果域中存在层次结构,它们通常最终会出现在代码中。您可以通过规划来节省未来的重构。例如,错误状态可能稍后也会出现错误详细信息。
我的经验法则是查看幻数出现的规范。如果它们各自与许多细节相关联,那么如果我只是将它们保持为整数,这可能表明未来的问题,因为我实际上是使用一个更复杂的实体的密钥。
此外,从固定域获取详细信息时,枚举可能比直接int更好。
答案 2 :(得分:0)
我会保持构造函数的简单。类似的东西:
public Response(int status)
public Response(int status, String reasonPhrase)
public Response(int status, Map<String,String> headers)
public Response(int status, String reasonPhrase, Map<String,String> headers)
或者,可能省略最后2个并提供setHeader(String, String)
答案 3 :(得分:0)
问问自己 - 每个状态代码需要不同的“类型”吗?例如,如果您想使用特定类型,请将OK作为某个方法的参数,这可能很有用。如果没有,我认为第二种方法没有任何好处。去找第一个。