处理7个以上的参数

sar*_*Fly 7 java

我有一个公共类,需要传递7个参数.目前,我能够将其中3个传递给构造函数,将另外4个传递给类中的公共方法.像这样:


Public Class AClass{
    private XClass axClass;
    private String par4;
    private String par5; 
    private String par6;
    private String par7;

    public AClass(String par1, String par2, String par3){
       aXClass = new XClass(par1,par2,par3);
    }

    public execute(String par4,String par5, String par6, String par7){
       //this is needed because they are used in other private methods in this class
       this.par4 = par4;
       this.par5 = par5;
       this.par6 = par6;
       this.par7 = par7;

       //call other private methods within this class. 
       //about 7 lines here
    }

}


我的问题是,这是要求班级客户传递参数的正确方法吗?

Sea*_*oyd 12

我会使用Builder模式而不是许多构造函数参数

有效的Java项2:在面对许多构造函数参数时考虑构建器

这是一个简单的类来说明:

public class Dummy {

    private final String    foo;
    private final String    bar;
    private final boolean   baz;
    private final int       phleem;

    protected Dummy(final Builder builder) {
        this.foo = builder.foo;
        this.bar = builder.bar;
        this.baz = builder.baz;
        this.phleem = builder.phleem;
    }

    public String getBar() {
        return this.bar;
    }

    public String getFoo() {
        return this.foo;
    }

    public int getPhleem() {
        return this.phleem;
    }

    public boolean isBaz() {
        return this.baz;
    }

    public static class Builder {
        private String  foo;
        private String  bar;
        private boolean baz;
        private int     phleem;

        public Dummy build() {
            return new Dummy(this);
        }

        public Builder withBar(final String bar) {
            this.bar = bar;
            return this;
        }

        public Builder withBaz(final boolean baz) {
            this.baz = baz;
            return this;
        }

        public Builder withFoo(final String foo) {
            this.foo = foo;
            return this;
        }

        public Builder withPhleem(final int phleem) {
            this.phleem = phleem;
            return this;
        }

    }

}
Run Code Online (Sandbox Code Playgroud)

你会像这样实例化它:

Dummy dummy = new Dummy.Builder()
                    .withFoo("abc")
                    .withBar("def")
                    .withBaz(true)
                    .withPhleem(123)
                    .build();
Run Code Online (Sandbox Code Playgroud)

好的部分:你可以获得构造函数参数的所有好处(例如,如果你需要它的不变性),但你也可以获得可读代码.


Mar*_*rvo 10

如果这是您想要的,那么不应该阻止您将7个参数传递给构造函数.我不知道是否有最大数量的参数可以传递给Java中的方法,但如果有最大值,它肯定高于7.

在创建类及其公共方法时,您将创建一个关于如何使用和访问该类的接口.从技术上讲,到目前为止你所做的是正确的.请求类的客户端传递参数是"正确的方法"吗?这取决于你,界面的设计者.

当我看到7个参数被传递时,我的第一直觉是默默地问:"这些参数之间是否有某种关系可能意味着它们在一个属于自己的类中很好地融合在一起?" 这可能是您在查看代码时要解决的问题.但这是一个设计问题,而不是正确性问题.