2015-07-17 3 views
1

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

interface interfacename{ 
    void function1(); 
    void function2(); 
} 


public class asyncfunction(){ 
    public interfacename listener; 
    ... 
    onasyncStart(...){ 
     listener.function1(); 
    } 
    ... 
    ... 
    onasyncComplete(...){ 
     listener.function2(); 
    } 
} 

public myclass(){ 
    .... 
    .... 
    methodcall(new interfacename(){ 
     @Override 
     public void function1(){ 
      // executes proper 
     } 

     @Override 
     public void function2(){ 
      // executes proper 
     } 
    } 
} 

Таким образом, вышеуказанный метод работает надлежащим образом.

Но я хочу называть только функцию1() иногда и только функцию2() при необходимости.

Я не хочу, чтобы оба метода выполнялись всегда. Код выглядит большим, и я не уверен, что он замедляет код или нет (не на уровне второго миллионного уровня битвы), но было бы очень приятно, если бы был другой способ иметь возможность выполнять определенные обратные вызовы, когда это необходимо.

ответ

5

Это звучит, как вы на самом деле, глядя на раздробления ваш interface на несколько интерфейсов, а также изменить метод, который принимает этот interface в качестве параметра, так что вместо этого принять interface, что он требует (например InterfaceOne) для того, для вызова метода в этом interface (например, function1()). Другой метод может вызвать вызов function2(), и в этом случае он примет аргумент типа InterfaceTwo.

Если вам нужно всегда вызывать оба метода из interface в вашем методе, но вам не всегда нужно вызывать какой-либо код в методах этого interface, то, что вы ищете, это следующее.

Вместо создания нового анонимного класса типа interfacename вы можете использовать базовый класс с пустым телом метода и просто переопределить те, которые вам нужны. Методы, реализуемые абстрактным базовым классом, по существу необязательны, тогда как те, которые не реализованы, являются требуемыми методами.

Это очень распространенный шаблон в разработке Java.

public interface InterfaceName { 

    void function1(); 
    void function2(); 

} 

public abstract class BaseInterfaceName implements InterfaceName { 

    public void function1() { 
    } 

    public void function2() { 
    } 

} 

public class MyClass { 

    public void myMethod() { 
     myMethodWithInterface(new BaseInterfaceName() { 
      @Override 
      public void function2() { 
       System.out.println("function2"); 
      } 
     }) 
    } 

    public void myMethodWithInterface(InterfaceName intf) { 
     intf.function1(); 
     intf.function2(); 
    } 

} 
1

Возможное решение - это объяснение @Nicklas.

Но, если вы используете Java 8, вы можете использовать default method. Таким образом, вы можете объявить интерфейс таким образом:

public interface InterfaceName { 
    default void function1(){ /* do nothing */} 
    default void function2(){ /* do nothing */} 
} 

Таким образом, вы можете избежать реализации методов, поскольку вы обеспечиваете реализацию по умолчанию. В моем примере по умолчанию ничего не делать, но, конечно, вы можете их персонализировать.

ПРИМЕЧАНИЕ: Очевидно, что на данный момент Android не поддерживает Java 8, поэтому вы не можете использовать это решение. Это был только совет Java.

+0

Поскольку im использует студию android, зависит ли она от версии java, установленной в системе или имеет собственный пакет? – user1217974

+0

Java 8 отлично! К сожалению, этот вопрос отмечен Android, который еще не поддерживает функции Java 8. – Nicklas

+0

Это зависит от используемой версии SDK Java. Поэтому, если вы используете Android, я предполагаю, что вы используете JDK 7. – GVillani82

Смежные вопросы