Конструктор в интерфейсе? - PullRequest
133 голосов
/ 10 мая 2010

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

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

Например,рассмотрим следующий класс сообщений:

public class MyMessage {

   public MyMessage(String receiver) {
      this.receiver = receiver;
   }

   private String receiver;

   public void send() {
      //some implementation for sending the mssage to the receiver
   }
}

Если определить интерфейс для этого класса, чтобы у меня было больше классов, реализующих интерфейс сообщений, я могу определить только метод send, а не конструктор.Итак, как я могу гарантировать, что каждая реализация этого класса действительно имеет набор получателей?Если я использую метод, подобный setReceiver(String receiver), я не могу быть уверен, что этот метод действительно вызывается.В конструкторе я смог это обеспечить.

Ответы [ 11 ]

0 голосов
/ 08 августа 2017

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

private interface Listener {
    void onComplete(databaseError, databaseReference);
}

public abstract class MyCompletionListener implements Listener{
    String id;
    String name;
    public MyCompletionListener(String id, String name) {
        this.id = id;
        this.name = name;
    }
}

private void removeUserPresenceOnCurrentItem() {
    mFirebase.removeValue(child("some_key"), new MyCompletionListener(UUID.randomUUID().toString(), "removeUserPresenceOnCurrentItem") {
        @Override
        public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) {

        }
    });
    }
}

@Override
public void removeValue(DatabaseReference ref, final MyCompletionListener var1) {
    CompletionListener cListener = new CompletionListener() {
                @Override
                public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) {
                    if (var1 != null){
                        System.out.println("Im back and my id is: " var1.is + " and my name is: " var1.name);
                        var1.onComplete(databaseError, databaseReference);
                    }
                }
            };
    ref.removeValue(cListener);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...