代码之家  ›  专栏  ›  技术社区  ›  Colin Mackay

Java7中的链式调用?

  •  6
  • Colin Mackay  · 技术社区  · 5 年前

    我只是在看一本书 Java 7 preview presentation (pdf) 还有一张幻灯片 链式调用 . 以下是幻灯片中使用的示例:

    // Construction with setters
    DrinkBuilder margarita = new DrinkBuilder();
    margarita.add("tequila");
    margarita.add("orange liqueur");
    margarita.add("lime juice");
    margarita.withRocks();
    margarita.withSalt();
    Drink drink = margarita.drink();
    
    // Construction with chained invocation
    Drink margarita = new DrinkBuilder()
        .add("tequila")
        .add("orange liqueur")
        .add("lime juice")
        .withRocks()
        .withSalt()
        .drink();
    

    margarita.this() margarita.that() 也不太方便。

    现在,我从Delphi world来到Java。在德尔福,有 with 语言结构。这是少数人所珍视的,也是许多人所厌恶的(或者是反过来呢?)。我发现 比链式调用(我相信它是基于 void 方法返回对已调用它的对象的引用,这是我不喜欢的部分,如下所示 应该回来 没有什么

    Java采用了语言特性,因此示例代码可以这样编写:

    Drink margarita = null;
    with (new DrinkBuilder()) {
        add("tequila");
        add("orange liqueur");
        add("lime juice");
        withRocks();
        withSalt();
        margarita = drink();
    }
    

    我是唯一一个喜欢这个解决方案而不是链式调用的人吗?其他人有这种感觉吗 具有

    6 回复  |  直到 12 年前
        1
  •  13
  •   dfa    7 年前

    这个 具有 语句可以使用带有初始值设定项的匿名类在Java中进行翻译:

    Drink margarita = new DrinkBuilder() {{
        add(“tequila”);
        add(“orange liqueur”);
        add(“lime juice”);
        withRocks();
        withSalt();
    }}.drink();
    

    here .

    class Chained {
    
        public Chained withFoo() { 
            // ...
            return this;
        }
    
        public Chained withBar() { 
            // ...
            return this;
        }
    }    
    

    JDK 7的一个提案是 allowing of chaining method also for void return type :

    class ChainedJava7 {
    
        public void withFoo() { 
            // ...
        }
    
        public void withBar() { 
            // ...
        }
    }    
    
        2
  •  2
  •   Uli Gerhardt    15 年前

    This 你可能会感兴趣。

        3
  •  2
  •   Dave Webb    15 年前

    我很喜欢 with 这种形式的语句,但我更喜欢VB版本:

    With testObject
        .Height = 100
        .Text = "Hello, World"
        .ForeColor = System.Drawing.Color.Green
    End With
    

    作为 With 块的前面仍然必须有一个 . 您知道您引用的是一个对象属性,而不是局部变量,从而减少了任何名称空间冲突。

    with (new DrinkBuilder()) {
        add(“tequila”);
        add(“orange liqueur”);
        add(“lime juice”);
        withRocks();
        withSalt();
        margarita = drink();
    }
    

    没有简单的方法来判断 withSalt() 这是一种 DrinkBuilder 或本地类中的方法。如果只允许 具有 具有 然后我认为它们变得不那么有用了。

        4
  •  1
  •   Hank Gay    15 年前

    with ; 我更喜欢这个 Python with statement . 我确实同意你的看法 void 无效的 虽然在您提供的示例中,如果一个人真的希望能够链接方法调用,那么他们应该只更改其方法上的返回类型,使其可链接。

        5
  •  1
  •   cadrian    15 年前

    也许对一个对象的多次调用是某些代码需要移动的标志?

        6
  •  1
  •   Jim Ferrans    15 年前

    约书亚·布洛赫 Effective Java 第#2项强烈建议在有大量参数的构造函数时使用生成器。一个原因是,可以编写它来保证构建对象始终处于一致状态。它还避免了在构建对象的类中使用复杂的“伸缩构造函数”。还有一个问题是,如果您希望构建的对象是不可变的(例如,为了线程安全),那么它不能有setter方法。