2017-07-19 30 views
2

在我的一个类的构造函数调用看起来是这样的:如何摆脱这个()构造函数中的长调用?

API() { 
    this(
     (new Client.ClientBuilder(AnotherClas.get(YetAnotherClass.class).getA(), 
        AnotherClas.get(YetAnotherClass.class).getBt())) 
        .withF(YetAnotherClass.class).build(), 
     (new Client.ClientBuilder(AnotherClas.get(YetAnotherClass.class).getA(), 
        AnotherClas.get(YetAnotherClass.class).getB()) 
        .withE(AnotherClas.get(YetAnotherClass.class).getC()) 
        .withD(AnotherClas.get(YetAnotherClass.class).getD())).build(), 
     (new Client.ClientBuilder(
        AnotherClas.get(YetAnotherClass.class).getA(), 
        AnotherClas.get(YetAnotherClass.class).getB()) 
        .withY(AnotherClas.get(YetAnotherClass.class).build() 
     ); 
    } 

在现实中,它甚至更糟,因为我模糊的类和方法名。

我正在使用Builder模式来生成客户端,我的第一个想法是首先生成三个客户端,然后在构造函数调用中传递变量。

但是,由于这发生在构造函数中,所以对它的调用必须是第一条语句。有什么我可以做的吗?

+1

也许分开一个'addClient()'方法,可以多次调用它。在这种情况下3.至少'API'对象将通过它的'init'阶段 – CraigR8806

+0

嗯,这是完全有道理:)谢谢! –

回答

3

唯一直接选择我看到:创建小helper方法做部分建设,如:

private AnotherClass makeAnotherClass() { 
    return new Client.ClientBuilder(AnotherClas.get(YetAnotherClass.class).getA(), 
    AnotherClas.get(YetAnotherClass.class).getBt())) 
    .withF(YetAnotherClass.class).build()); 

如果没有办法让复杂的摆脱,那么至少将其转换为更容易消化的“格式”。

而上述更容易 - 因为您减少了所需的数量。这意味着你的大脑可以更容易地创建一个“嵌入”代码的“上下文”。这可能听起来像是一件小事 - 但我们的大脑正在不断地这样做。他们试图抽象以创造“感觉”和“分类”。因此,与一个方法中具有相同内容的情况相比,一组名为小方法的方法更好。

,当然还有,你现在可以改变你的构造函数调用类似

this(makeAnotherClass(), makeYetAnotherClass() ... 

是的,这将创建“开销”因为你现在有更多的方法;并且它们可能只被调用一次。但仍然:它允许你坚持Single Layer of Abstraction的原则。遵循这个原则肯定会提高代码的可读性。