2016-11-28 52 views
1

我遇到了下面的代碼,想知道每個Tree實例是否會引用不同的EMPTY對象,或者它是否會爲所有樹實例引用相同的對象(僅實例化一次)。Java:初始化東西的次數

class Tree<T> { 
    public final Tree<T> EMPTY = new EmptyTree<T>(); 

    /** True iff THIS is the empty tree. */ 
    public boolean isEmpty() { return false; } 

    private static class EmptyTree<T> extends Tree<T> { 
     /** The empty tree */ 
     private EmptyTree() { } 
     public boolean isEmpty() { return true; } 
    } 
    ... 
} 

我的直覺是,它必須是'公共靜態最終......'只有一個對象要在EMPTY類中初始化。

page 99-100 of Data Structures Into Java

回答

4

你是對的。此代碼每次使用一個新的 EMPTY對象。

這當然是有效的,但不是「正常」的事情。當然,我對那些認爲靜態實際上是良好面向對象設計中的異常的人說起;但Java語言允許使用static;並且(除非在這裏沒有顯示代碼中有充足的理由)......合理的方法是讓共享靜態EMPTY樹不變。

但是,該代碼看起來很奇怪 - 有一個isEmpty()方法返回總是false的「意義」,例如?!

我的「直覺」在這裏:我會退一步,對該代碼進行全面檢查,以瞭解該類內是否存在「更多」意外。

+1

正確答案。在Java中通常都是如此,但有一個例外:String interning。 Java的一些實現可以回收'String'對象,而不是總是實例化一個新對象。請參閱:http://stackoverflow.com/q/10578984 –

+0

它來自教科書;我添加了EMPTY引用的EmptyTree類的一部分。文中說:「只有一個空樹(保證是因爲EmptyTree類是Tree類的私有,是Singleton設計模式的一個例子),但是這棵樹是一個完整的對象......」所以我很困惑因爲它似乎(如果我提供了相關的代碼)像許多實例將被創建而沒有「靜態」,並且Singleton模式只允許創建一個全局對象。 (對不起,如果我是迂腐的,當我對某事感到困惑時,我儘可能清楚) – Rdesmond