2016-08-02 14 views
23

Câu hỏi của tôi:

Tôi đã xem mã nguồn của TextWatcher và tôi không có khái niệm ở đây. Điểm mở rộng của NoCopySpan là gì?Lớp bên trong bên trong Giao diện thực hiện cùng một Giao diện, những gì chúng tôi đang đạt được bằng cách này?

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

Tôi nghĩ đó chỉ là lớp '' 'helper''' nên được sử dụng khi bạn cần chuyển một thể hiện của '' 'NoCopySpan'''. – danypata

Trả lời

12

NoCopySpan chỉ là một marker interface. Theo javadoc nó được sử dụng để thay đổi hành vi của thói quen sao chép của các đối tượng Spanned (nó dựa vào loại thành phần). Ví dụ: android.text.SpannableStringBuilder sử dụng thông tin thừa kế đó để bỏ qua quá trình sao chép khi xây dựng.

Cách tiếp cận này có một số nhược điểm nhưng vẫn khá phổ biến. Lý do là sự tồn tại của lớp Concrete là cung cấp cách thuận tiện để xây dựng giả lập on-op (hoặc mặc định) của giao diện NoCopySpan.

+0

Bất kỳ tham chiếu hoặc giải thích nào về: "sửa đổi hành vi của thói quen sao chép của đối tượng Spanned" AND "cung cấp cách thuận tiện để xây dựng giả lập trên (hoặc mặc định) của giao diện NoCopySpan". –

+0

@HishamMuneer Tôi không phải là chuyên gia Android nhưng có một ví dụ bạn có thể tìm thấy trong mã nguồn Android tức là [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). Tôi sẽ sửa đổi câu trả lời của tôi – vsminkov

+0

@ HishamMuneer hm ... Tôi không thể tìm thấy các ví dụ cho Android 5.1.1 gần đây. Dường như 'NoCopySpan' vẫn được sử dụng để tương thích ngược hoặc có thể không được chấp nhận nữa. – vsminkov

0

Đối với đặc điểm kỹ thuật của giao diện NoCopyScan, lớp bên trong triển khai cùng một giao diện có thể được sử dụng làm thực hiện mặc định/đại diện của giao diện ở bất kỳ đâu bên ngoài.

An inner class in an interface được coi là một lớp bên trong tĩnh hoàn toàn. Chúng ta có thể khởi tạo lớp bên trong của giao diện giống như một lớp bên trong tĩnh và đặt NoCopyScan để sử dụng. Vui lòng tìm một ví dụ đơn giản mô tả cách sử dụng triển khai mặc định của giao diện với sự trợ giúp của lớp bên trong dưới đây:

/* 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(); 

    } 
} 
Các vấn đề liên quan