2014-09-20 56 views
1
class Rocket { 

    public Rocket() {} 

    public interface RocketListener { 
     void RocketLaunched(); 
    } 

    RocketListener listener; 
    public void setRocketListener(RocketListener listener) { 
     this.listener = listener; 
    } 

    //When rocket get launched. 
    listener.RocketLaunched(); 
} 


//first case : when implementing listner 
class MyClass implements RocketListener { 

    Rocket rocket = new Rocket(); 
    rocket.setRocketListener(this); 

    @Override 
    public void RocketLaunched() { 
     //when rockect get launched. it get called 
    } 
} 


//second case : when using anonymous class for listner 
class MyClass { 

    Rocket rocket = new Rocket(); 
    rocket.setRocketListener(new RocketListener() { 

     @Override 
     public void RocketLaunched() { 
      //when rockect get launched. it get called 
     } 
    }); 
} 

在第一種情況:當MyClass的實現一個接口,那麼參數在setOnClickListener發送()是類的實例。
第二種情況: setOnClickListener()中的參數send是匿名類。就是用聽者更有效的方式:使用匿名類或者實現聽者

問題1:在第二種情況下,匿名類是否持有MyClass的引用?
問題2:這兩種情況下在內存上製作的指紋是什麼?
問題3:哪種情況最適合使用,以提高性能或減少內存?

回答

1

內部類實例可以訪問容器實例內存。如果名稱衝突,您可以通過其名稱強制使用容器實例,這要感謝MyClass.this

答1:

答2: 2類創建〜相同的指紋。在第一種情況下,監聽器類可以在其他地方重用。

答案3:一個內部類可以訪問容器實例的屬性和方法→非常有用,但是當一個監聽器類可以在多個用法之間共享時,它使用較少的類。最好的方法是分解更多代碼的方式。

+0

假設,如果我使用超過1個匿名類,比我應該避免它,而不是它,我應該實現偵聽器。所以,第二種情況可能消耗更多的內存,如果它將在多個地方使用。我對嗎 ? – 2014-09-21 17:38:42

+0

另外我不清楚內存部分。它將如何包含相同的內存空間。 – 2014-09-21 17:48:37