2016-06-02 2 views
1

Я хочу знать, в чем разница между интерфейсом реализации и созданием его экземпляра, вот пример кода, этот код позволяет общаться между 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) { 
      // 
     } 
    } 

или создать экземпляр t его интерфейс в 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(); 
       } 
      } 
     }); 
    } 

} 

и в чем разница между ними? спасибо

ответ

3

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

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

Класс представляет собой реализованную функциональность.

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

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

Пожалуйста, см the tutorial on anonymous classes here

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

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

+0

спасибо, но мой вопрос был: когда я должен использовать первый код и когда я должен использовать второй код? –

+1

@ OtmàaneFikri - Смотрите мое обновление –

0

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

interface Calculate{ 
    void doCalculation(); 
} 

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

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

Calculate calculate = new Sample(); 
calculate.doCalculation(); 
Смежные вопросы