有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如果构造函数中的参数太多,是否存在性能问题?

我知道这不是一个好的设计,如果有选择的话,我宁愿使用setter/getter。但是我正在写一个JPA实体,并且需要这个构造函数来JPQL目的,所以简而言之,我必须使用构造函数来初始化字段和嵌入实体的值

因此,我必须在实体的构造函数中生成大约40个参数,并且必须让JPA非常频繁地使用构造函数。我一直在网上搜索,没有发现任何东西表明java构造函数中的参数列表过大可能会导致性能问题,但可能是我没有做足够的功课

因此,任何建议都是值得赞赏的,性能是唯一的问题。 谢谢


共 (2) 个答案

  1. # 1 楼答案

    为了简化对象的构造,应该使用Builder模式:

    public class SomeComplexClass
    
        public static class SomeComplexClassBuilder {
    
            /* fields to set for the constructor */
    
            /* getters and setters for those fields*/
    
            public SomeComplexClass build() {
                //verify the fields are all correct for the object
                return new SomeComplexClass(/* pass the necessary fields*/);
            }
    
        }
    
        private SomeComplexClass(/*arguments*/) {...}
    
    }
    

    然后可以使用生成器进行构造:

    SomeComplexClass obj = new SomeComplexClass.SomeComplexClassBuilder()
                                               .setSomething(/*argument*/)
                                               .setAnother(/*argument*/)
                                               .build();
    

    您可以链接这些方法,以返回生成器对象来完成所有这些操作:

    public SomeComplexClassBuilder setField(Object argument) {
        this.argument = argument;
        return this;
    }
    
  2. # 2 楼答案

    如果构造函数中的参数太多,是否存在性能问题这方面没有什么可担心的,这方面没有性能问题

    这是因为查询执行本身的开销(一旦到达数据库)加上将查询发送到网络并接收回数据所涉及的网络开销,要比构造函数中太多参数所带来的任何损失高出几个数量级

    尝试寻找替代方案的原因是代码的可维护性。您可能会遇到一个具有许多列的高度非规范化的表。这意味着数据库行通常可以被分成几个可嵌入的部分。下面的示例显示了如何将4个相关列分组到一个可嵌入的Address类中:

    @Entity
    @Table("MANY_COLS_TABLE")
    public class User {
       private Long id;
       @Embedded
       private Address address;
    }
    
    @Embeddable
    public class Address {
        private String streetAdress;
        private int number;
        private String city;
        private ZipCode zipcode;
    }