Bean与通用字段并不总是使用

时间:2014-03-28 12:18:05

标签: java generics

这是一个奇怪的情况:我有一个这样的bean存储一些信息,我需要泛型,因为字段"数据"可以包含不同类型的数据。

public class Request<T> {

    private String name;
    private Integer code;
    private T data;

    /* Getter and setters */
}

事实是&#34;数据&#34;并不总是使用,有时它可以为null。如果我想避免原始类型,我必须定义一个类型,如下所示:

Request<Object> req = ....

有没有更好的方法,我可以两者1)避免原始类型2)在我的请求对象中有一个通用数据字段???

5 个答案:

答案 0 :(得分:1)

也许你应该以不同的方式思考:在你的情况下,Request并不总是有关联的数据。使用null对值进行建模 - 值是一个错误的决定,因为每次要使用数据时都必须检查这一点。在某些时候,您希望以不同的方式处理Request,而不是数据Request

也许您应该将Request设置为包含getName()getCode()等方法的界面,并创建实现此界面的两个具体类RequestWithData<T>RequestWithoutData。然后,如果提供了非空数据,则可以检查是否创建了RequestWithData<T> - 实例。此外,您可以在方法签名中表明您需要Request包含数据或没有数据。这样可以使设计更加简洁,避免出现问题。

答案 1 :(得分:1)

如果您不介意请求类型,请在声明中使用Request<?>。 如果请求为空(意味着没有类型,可以设置为数据),请将其声明为Request<Void>

答案 2 :(得分:1)

您可以随时使用Void类型,例如

Request<Void> req = ...

wildcard

Request<?> req = ...

答案 3 :(得分:1)

也许您应该考虑更改对象层次结构。如果在某些情况下不使用数据,可能应该有两个对象:

class Request {

    private String name;
    private Integer code;

    /* Getter and setters */
}

class DataRequest<T> extends Request {
    private T data;

    /* Getter and setters */
}

并使用:

Request req1 = new Request();
Request req2 = new DataRequest<String>();

答案 4 :(得分:0)

使用新的&#39;可选&#39;在Java 8中键入。它专门针对这些案例而制作。如果您因为某种原因无法使用Java 8,那么Google Guava库也会实现该类型。请查看此示例:https://gist.github.com/9833966