Разница между реализацией интерфейса и созданием его экземпляра

Я хочу знать, в чем разница между реализацией интерфейса и созданием его экземпляра, вот пример кода, этот код позволяет осуществлять связь между IntentService и Activity с помощью ResultReceiver.

Класс MySimpleReceiver:

public class MySimpleReceiver extends ResultReceiver {

public static final Creator CREATOR = null;
private Receiver receiver;

// Constructor takes a handler
public MySimpleReceiver(Handler handler) {
    super(handler);
}

// Setter for assigning the receiver
public void setReceiver(Receiver receiver) {
    this.receiver = receiver;
}

// Defines our event interface for communication
public interface Receiver {
    void onReceiveResult(int resultCode, Bundle resultData);
}

// Delegate method which passes the result to the receiver if the receiver
// has been assigned
@Override
protected void onReceiveResult(int resultCode, Bundle resultData) {
    if (receiver != null) {
        receiver.onReceiveResult(resultCode, resultData);
    }
}
}

Какой лучший способ настроить обратный вызов для получения данных от службы:

реализации MySimpleReceiver.Receiver Интерфейс в MainActivity:

public class MainActivity extends Activity implements MySimpleReceiver.Receiver 

    {

        @Override
        public void onReceiveResult(int resultCode, Bundle resultData) {
            //
        }
    }

или создание экземпляра интерфейса в MainActivity:

public class MainActivity extends Activity {


    public MySimpleReceiver receiverForSimple;


    // Setup the callback for when data is received from the service
    public void setupServiceReceiver() {
        receiverForSimple = new MySimpleReceiver(new Handler());
        // This is where we specify what happens when data is received from the
        // service
        receiverForSimple.setReceiver(new MySimpleReceiver.Receiver() {
            @Override
            public void onReceiveResult(int resultCode, Bundle resultData) {
                if (resultCode == RESULT_OK) {
                    String resultValue = resultData.getString("resultValue");
                    Toast.makeText(MainActivity.this, resultValue, Toast.LENGTH_SHORT).show();
                }
            }
        });
    }

}

а в чем разница? Спасибо

2 ответа

Решение

Вы не можете "создать экземпляр" интерфейса, только экземпляр класса, который его реализует.

Интерфейс - это не более чем тесно связанный контракт, который вы должны полностью выполнить.

Класс - это реализованная функциональность.

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

Анонимные классы чрезвычайно полезны, но трудны для чтения, особенно если вы привыкли к более старым версиям Java или другим языкам, которые не поддерживают этот вид кода.

Пожалуйста, смотрите учебник по анонимным классам здесь

Вы бы использовали первый пример (прямая реализация), если хотите использовать класс любым способом. Это делает ваше решение несколько больше, хотя.

Второй пример хорош, если у вас есть одноразовое использование, и вы не хотите, чтобы в вашем решении было много файлов классов.

Вы не можете создать экземпляр интерфейса. Вы можете создать только экземпляр класса, который реализует этот интерфейс. Пример:

interface Calculate{
    void doCalculation();
}

class Sample implements Calculate{
   @Override
   void doCalculation(){
   //TODO Write your code to calculate
  }
}

// ======================================= //

Calculate calculate = new Sample();
calculate.doCalculation();
Другие вопросы по тегам