方法鏈接Java



2 Answers

我能想到的另一個原因是性能 ,或者更確切地說:不要為你不使用的東西買單。 在每個方法都不是很昂貴之後return this ,但仍然需要很少的額外CPU週期和一個CPU註冊表。

甚至有一個想法是向每個聲明void返回值的方法添加隱式return this ,但它被拒絕了。

Question

雖然我早些時候回答了一些問題,但最近我一直在做的一些工作中,我一直在想為什麼Java不支持對其內置類進行方法鏈接。

例如,如果我要創建一個Car類,我可以通過重新限製而不是void來使其可鏈接 ,如下所示:

public class Car {
    private String make;        

    public Car setMake(String make) {
        this.make = make;
        return this;
    }   
}

內置庫不傾向於以這種方式做事有什麼特別的原因嗎? 方法鍊是否存在缺點?

我可能忽略了一些可以解釋缺少方法鏈接的東西,但是默認情況下返回void的任何setter方法應該返回對此的引用(至少在我看來應該如此)。 這將使以下情況變得更加清潔。

container.add((new JLabel("label text")).setMaximumSize(new Dimension(100,200)));

而不是更長時間的囉嗦: 注意:如果你願意,它不會阻止你以這種方式編碼。

JLabel label = new JLabel("label text");
label.setMaximumSize(new Dimension(100,200));
container.add(label);

我非常有興趣聽到這個決定背後的原因,如果我不得不猜測會有與此相關的開銷,所以只應在需要時使用。




方法鏈通常與Builder模式一起使用,您可以在StringBuilder類中看到它。 除此之外,方法鏈接可以使命令和創建分離不那麼清晰,例如repaint()也應該是流暢的接口的一部分嗎? 然後我可以:

container.add(label).repaint().setMaximumSize(new Dimension(100,200)));

突然,我的調用順序變得很重要,可以隱藏在鏈接方法中。




不實現方法鏈接的原因將是以下一些原因:

  • 方法鏈的最大問題是整理問題。 雖然有解決方法,但通常如果遇到這種情況,最好使用嵌套函數。 如果您遇到上下文變量的混亂,嵌套函數也是更好的選擇。

  • 無法保證鏈外的對象實際上會返回有效的非null對象。 此外,調試這種代碼風格通常要困難得多,因為許多* IDE *都不會在調試時將方法調用評估為可以檢查的對象

  • 當你將例程調用到其他類以將參數傳遞給其中一個鏈接方法時,當有很多參數要傳遞時,主要因為這些行變得很長,這會讓你感到困惑

  • 還有一個性能問題,它將在內存上努力工作




Related