具有动态参数数量的泛型类

时间:2012-02-19 13:08:40

标签: java

我正在寻找一种具有动态数量属性的泛型类的方法。

示例:(类用户)

User user1 = new User(1,"john","115 street","male",60,150, 15.125);
User user2 = new User(2,"john2","116 street","male",60,150, 15.125,"New york");

等。

这可以用Java完成,或者你能推荐我任何可能的选择(如果没有)?

5 个答案:

答案 0 :(得分:6)

您可以在Java中创建varargs constructor。在你的情况下,它看起来像这样:

public class User {
  private final long id;
  private final String name;
  private final Object[] parameters;

  public User(long id, String name, Object... parameters) {
    this.id = id;
    this.name = name;
    this.parameters = parameters;
  }
}

虽然我认为这不是一个好的模式,但我建议你提出一个更好的想法,例如包含可选参数的Map<String, Object>,或类似的东西。

答案 1 :(得分:4)

不幸的是,Java不支持动态属性。

你可以用以下方式破解:

  1. Vararg方法。使用以下签名method(Object... objects)。 在这种情况下,您将把参数对象的数组传递给方法 - 只需根据需要处理它们。

  2. 地图结构。我认为它是更好的解决方案,你的类中有参数的地图。键的位置 - 参数的名称和值的实际值。

    class User {    
    
    Map<String, Object> properties;
    
          Object getParameter(String key){
            return properties.get(key);
          }
          void addParameter(String key, Object value){
            properties.put(key, value);
          }
    
    }
    
  3. 使用方法addParameter向对象添加新参数。

    使用方法getParameter提取所需的值(例如getParameter("name");)

答案 2 :(得分:2)

在您的情况下(在我看来),最好使用构建器模式。见here。或者参见有效Java中的Bloch第2项

答案 3 :(得分:2)

是的,这是可能的,但可能不是一个好主意。

你可以这样做:

User(Object... args) {
    Object someObject = args[0]; // Check for length!
}

这在Java术语中称为varargs。但是你在Object内得到的所有论点都是简单的Object[],并且必须找到一种方法来解释它们。调用者不知道在什么位置放置什么参数。如果您想允许这样做,通常不会使用Java类型和绑定系统的语言。

主要的选择 - “Java的做法” - 是重载方法;您可以在一个类型中拥有多个具有给定名称和不同参数的方法。例如:

User(long id, String name) { ... }
User(long id, String name, String address) { ... }
// and so on

这可能很麻烦,因此IDE可以为您生成这些工具(至少对于构造函数)。

答案 4 :(得分:1)

这是Builder pattern

的候选人