簡體   English   中英

使用監聽器的更有效方法:使用匿名類或實現列表器

[英]Which is more efficient ways to use listener : using Anonymous class or implementing listner

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()中的send參數是該類的實例。
在第二種情況下: setOnClickListener()中的send參數是匿名類。

問題1:在第二種情況下,匿名類是否擁有MyClass的引用?
問題2:在這兩種情況下,存儲器上的指紋是什么?
問題3:哪種方法最適合使用,以提高性能或保留較少的內存?

內部類實例可以訪問容器實例的內存。 在名稱沖突的情況下,由於MyClass.this ,您可以通過其實例名稱強制使用容器實例。

答案1:可以

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM