Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 具有动态参数数的泛型类_Java - Fatal编程技术网

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

Java 具有动态参数数的泛型类,java,Java,我正在寻找一种方法来创建一个具有动态属性数的泛型类 示例:(类用户) 等等 这可以用Java来完成吗?或者你能给我推荐一些可能的替代方案(如果没有的话)?你可以用Java来创建一个。在您的情况下,它将如下所示: public class User { private final long id; private final String name; private final Object[] parameters; public User(long id, String na

我正在寻找一种方法来创建一个具有动态属性数的泛型类

示例:(类用户)

等等

这可以用Java来完成吗?或者你能给我推荐一些可能的替代方案(如果没有的话)?

你可以用Java来创建一个。在您的情况下,它将如下所示:

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
,或者类似的东西。

在您的情况下(在我看来),这是一个的候选模式,使用生成器模式会更好。看见或者在有效的Java中查看Bloch的第2项是的,这是可能的,但可能不是一个好主意

你可以做:

User(Object... args) {
    Object someObject = args[0]; // Check for length!
}
这在Java行话中称为
varargs
。但是,在
对象[]
中,所有参数都是简单的
对象
s,必须找到一种方法来解释它们。调用方不知道在什么位置放置什么参数。如果您想允许这样做,您通常不会使用带有Java类型和绑定系统的语言

主要的替代方案——“Java的实现方式”——是重载该方法;一个类型中可以有多个具有给定名称和不同参数的方法。例如:

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

这可能很麻烦,因此IDE有工具为您生成这些属性(至少对构造函数是这样)。

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

您可以通过以下方式解决此问题:

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

  • 地图结构。我认为它是更好的解决方案,在类中有带参数的map。其中是键-参数的名称及其实际值

    class User {    
    
    Map<String, Object> properties;
    
          Object getParameter(String key){
            return properties.get(key);
          }
          void addParameter(String key, Object value){
            properties.put(key, value);
          }
    
    }
    
    类用户{
    地图属性;
    对象getParameter(字符串键){
    返回properties.get(key);
    }
    void addParameter(字符串键、对象值){
    属性。put(键、值);
    }
    }
    
  • 使用方法
    addParameter
    向对象添加新参数


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

    在Java等强语言中,您无法动态创建类型,因为所有类型都是在编译时指定的。您的请求用动态语言(如Python或Ruby)解决。您不应该用映射替换“普通”静态属性(如名称、地址…)。您失去了类型安全性、编辑器支持、拼写检查/编译器支持(
    getParameter(“nam”)
    有效)、JavaBeans支持。尤其是对于后者,所有依赖于此的工具(如Hibernate)都将失败或需要额外的工作。仅对真正的动态参数使用贴图。确定。即使属性是可选的,也不应该使用Map(最好使用Builder模式)
    class User {    
    
    Map<String, Object> properties;
    
          Object getParameter(String key){
            return properties.get(key);
          }
          void addParameter(String key, Object value){
            properties.put(key, value);
          }
    
    }