java使用匿名類直接new接口

翻看Vector代碼的時候,看到這麼一段。java

/**
     * Returns an enumeration of the components of this vector. The
     * returned {@code Enumeration} object will generate all items in
     * this vector. The first item generated is the item at index {@code 0},
     * then the item at index {@code 1}, and so on.
     *
     * @return  an enumeration of the components of this vector
     * @see     Iterator
     */
    public Enumeration<E> elements() {
        return new Enumeration<E>() {
            int count = 0;


            public boolean hasMoreElements() {
                return count < elementCount;
            }


            public E nextElement() {
                synchronized (Vector.this) {
                    if (count < elementCount) {
                        return elementData(count++);
                    }
                }
                throw new NoSuchElementException("Vector Enumeration");
            }
        };
    }

 

 Enumeration是個接口,內部定義此處不綴述。this

此處用到了這種new接口的使用方法,若是有些場合,只須要臨時須要建立一個接口的實現類,上面的"技巧"能夠用來簡化代碼.
在結合接口內部的方法設定,便可實現強大的處理方式,而省去不少單獨處理邏輯問題。

咱們在仔細看,會發現實現的接口實例中並無elementCount,而elementCount是在Vector中定義的,那麼若是調用該方法,返回一個接口實例,在使用該接口實例的時候,如何獲取到該值?
因而寫一個demo查看下,

會發現返回的實例裏面維護了一個包含v實例成員變量的實例指向。因此在其方法實現裏面能夠使用到該值。(至於其如何實現的爲探究,讀到此文知道的讀者能夠留言,謝謝)設計

那麼會想,是否返回一個對象都會封裝一個此類指向呢,能夠本身按照此種方式寫一個試試。3d

Car是一個接口,按照上述方式模式實現的,存在上述所說引用;Student並無。code

總結:component

一、適當的時候巧用返回接口實例方式,可結合模式方式實現某種功能簡化;對象

二、是否能夠利用其引用處理某些問題,什麼樣的修飾符的成員變量能被引用對象實現,這種設計的初衷考慮哪些等等,值得神經的時候思考下。blog

三、另外new 接口方式能夠當作參數傳遞。如t.inject(new Car(){接口

  接口實現方法;element

});

相關文章
相關標籤/搜索