use*_*974 1 android interface callback
我有一个简单的类,启用了接口,并在使用时正常工作.
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
}
}
}
Run Code Online (Sandbox Code Playgroud)
所以上面的方法是正常的.
但我想有时只调用function1(),只需要调用function2().
我不想总是实现这两种方法.代码看起来很大,我不确定它是否会减慢代码速度(不是在毫秒级别btw)但是如果有另一种方法可以在需要时执行特定的回调,那将会非常好.
听起来你真的在考虑将你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();
}
}
Run Code Online (Sandbox Code Playgroud)
一种可能的解决方案是@Nicklas 解释的解决方案。
但是,如果您使用 Java 8,则可以使用default method. 所以你可以这样声明你的接口:
public interface InterfaceName {
default void function1(){ /* do nothing */}
default void function2(){ /* do nothing */}
}
Run Code Online (Sandbox Code Playgroud)
因此,您可以避免实现这些方法,因为您提供了默认实现。在我的示例中,默认设置是不执行任何操作,但是当然,您可以对它们进行个性化设置。