具有多个构造函数参数值或多个类的单个类?

时间:2010-07-13 19:56:47

标签: java oop

我有一个类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)

4 个答案:

答案 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作为某个方法的参数,这可能很有用。如果没有,我认为第二种方法没有任何好处。去找第一个。