Внутренний класс внутри интерфейса, реализующего тот же интерфейс, чего мы этим достигаем?

Мой вопрос:

Я просматривал исходный код 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 {}
}

person Hisham Muneer    schedule 02.08.2016    source источник
comment
Я думаю, что это просто класс helper, который следует использовать, когда вам нужно передать экземпляр NoCopySpan.   -  person danypata    schedule 02.08.2016


Ответы (2)


NoCopySpan — это просто интерфейс маркера. Согласно javadoc, он используется для изменения поведения процедуры копирования объектов Spanned (это зависит от типа компонентов). Например, android.text.SpannableStringBuilder использует такую ​​информацию о наследовании, чтобы пропустить копирование спанов при построении.

Этот подход имеет некоторые недостатки, но все же довольно распространен. Причина существования класса Concrete состоит в том, чтобы обеспечить удобный способ создания фиктивной (или стандартной) реализации интерфейса NoCopySpan на рабочем месте.

person vsminkov    schedule 09.08.2016
comment
Любая ссылка или объяснение: изменить поведение процедуры копирования составных объектов И предоставить удобный способ создания оперативной (или стандартной) реализации интерфейса NoCopySpan. - person Hisham Muneer; 09.08.2016
comment
@HishamMuneer Я не эксперт по Android, но есть примеры, которые вы можете найти в исходном коде Android, например android.text.SpannableStringBuilder. я изменю свой ответ - person vsminkov; 09.08.2016
comment
@HishamMuneer хм ... Я не могу найти примеры для последней версии Android 5.1.1. Похоже, что NoCopySpan все еще используется для обратной совместимости или скоро может быть объявлено устаревшим. - person vsminkov; 09.08.2016
comment
Спасибо за ответ друг. Действительно ценю это. :) - person Hisham Muneer; 09.08.2016

Что касается спецификации интерфейса NoCopyScan, внутренний класс, реализующий тот же интерфейс, может использоваться как реализация/представление интерфейса по умолчанию где угодно снаружи.

внутренний класс в интерфейсе неявно рассматривается как статический внутренний класс. Мы можем создать экземпляр внутреннего класса интерфейса точно так же, как статический внутренний класс, и использовать 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();

    }
}
person Akash Mishra    schedule 16.08.2016