2016-08-02 81 views
23

我的問題:

我在看TextWatcher的源代碼,我沒有在這裏得到這個概念。 延伸到NoCopySpan有什麼意義?實現相同接口的接口內的內部類,我們通過這個實現了什麼?

TextWatcher.java:

public interface TextWatcher extends NoCopySpan { 
    public void beforeTextChanged(CharSequence s, int start, int count, int after); 
    public void onTextChanged(CharSequence s, int start, int before, int count); 
    public void afterTextChanged(Editable s); 
} 

NoCopySpan.java:

package android.text; 

/** 
* This interface should be added to a span object that should not be copied into a new Spanned when performing a slice or copy operation on the original Spanned it was placed in. 
*/ 
public interface NoCopySpan { 
    /** 
    * Convenience equivalent for when you would just want a new Object() for 
    * a span but want it to be no-copy. Use this instead. 
    */ 
    public class Concrete implements NoCopySpan {} 
} 
+1

我覺得只是一個'''helper'''當你需要應使用類傳遞'''NoCopySpan'''的實例。 – danypata

回答

12

NoCopySpan只是一個marker interface。根據javadoc它用於修改Spanned對象的複製例程的行爲(它依賴於組件的類型)。例如,android.text.SpannableStringBuilder使用這種繼承信息來跳過施工時的跨越複製。

這種方法有一些缺點,但仍然很常見。 Concrete類存在的原因是爲構造接口的在線虛擬(或默認)實現提供便利的方式。

+0

任何參考或解釋:「修改Spanned對象的複製例程的行爲」和「提供構建NoCopySpan接口的On-op虛擬(或默認)實現的便利方法」。 –

+0

@HishamMuneer我不是一個android專家,但有一個例子,你可以在android源代碼中找到ie [android.text.SpannableStringBuilder](http://grepcode.com/file/repository.grepcode.com/java/ext /com.google.android/android/4.4.4_r1/android/text/SpannableStringBuilder.java#75)。我會修改我的回答 – vsminkov

+0

@HishamMuneer hm ...我找不到最新的5.1.1 android的例子。似乎'NoCopySpan'仍然用於向後兼容,或者很快可能會被棄用。 – vsminkov

0

至於界面NoCopyScan的說明書中,內部類實現相同的接口可以被用作一個默認實現/表示該接口的任何地方外面。

inner class in an interface被隱式處理爲靜態內部類。我們可以像接口靜態內部類一樣實例化接口的內​​部類,並使用NoCopyScan。請找一個簡單的例子,描繪了與下面的內部類的幫助界面的默認實現的用法:

/* package whatever; // don't place package name! */ 

import java.util.*; 
import java.lang.*; 
import java.io.*; 

/* Name of the class has to be "Main" only if the class is public. */ 
interface NoCopy{ 

public void doStuff(); 

public class Conc {    //Inner Class 
    public int retStuff(){ 
     return 2; 
    } 
    } 




// public void doStuff(){ 
//  System.out.println("Overriding in inner class"); 
// } 
} 


class ConcOut { 

    public int returnStuff(){ 
     return 5; 
    } 


    public void doStuff(){ 
     NoCopy.Conc innerObj = new NoCopy.Conc(); //Instantiating inner class 
     //NoCopy.Conc innerObj = (new ConcOut()).new Conc(); 

     System.out.println("overriding in outside class ConcOut "+ innerObj.retStuff());        // calling the method of inner class 
    } 
} 

class Ideone 
{ 
    public static void main (String[] args) throws java.lang.Exception 
    { 
     // your code goes here 
     ConcOut conObj = new ConcOut(); 
     conObj.doStuff(); 
     //ConcOut.Conc concInner = conObj.new Conc(); 

    } 
}