Java接口中的可选方法

时间:2011-03-11 20:34:16

标签: java android interface

我有一个包含多个方法定义的界面,我会喜欢要求其中的一些。

这可能吗?如果是这样,我该如何实现呢?

我尝试设置@Optional的注释,但这似乎不起作用。

我是否必须在某处定义Optional注释?

4 个答案:

答案 0 :(得分:22)

Java中没有@Optional注释。您可以做的一件事是创建一个接口,然后创建一个提供存根实现的抽象类。然后,您的类可以扩展此基类并覆盖他们感兴趣的方法。

答案 1 :(得分:14)

你可以有一个Abstract类,用空函数实现实现这个接口,然后从Abstract类

扩展

话虽如此,我会质疑为什么你需要这样做。也许您需要将界面拆分为多个较小的界面并实现您所需的唯一一个

答案 2 :(得分:7)

虽然我同意其他答案,但应该注意JDK中存在这样的可选方法。例如,List.add()是可选的。如果实现不想实现此方法,则必须抛出UnsupportedOperationException。

如果您想知道是否实现了可选方法,那么您可以添加另一种方法(非可选):

/**
 * Returns true if optionalOperation() is supported and implemented, false otherwise
 */
boolean isOptionalOperationSupported();

/**
 * implements he foobar operation. Optional. If not supported, this method must throw
 * UnsupportedOperationException, and isOptionalOperationSupported() must return false.
 */
void optionalOperation();

答案 3 :(得分:4)

"从概念上讲,如果您不能依赖它提供的合同,那么界面会有什么用处?"埃里克说。

这是真的,但还有另一个考虑因素:可以期望不同类的对象符合接口中包含的某些属性或方法,通过测试实现哪些属性或方法来安全地处理它们。

这种方法可以经常在Objective-C或Swift Cocoa下满足,“协议” - 等同于“接口” - 允许将“可选”定义为属性或方法。

可以测试对象实例以检查它们是否符合专用协议。

// Objective C

[instance conformsToProtocol:@protocol(ProtocolName)] => BOOL

// Swift (uses an optional chaining to check the conformance and the “if-let” mech)

if let ref: PrototocolName? = instance  => nil or instance of ProtocolName

可以检查方法(包括getter和setter)的实现。

// Objective C

[instance respondsToSelector:@selector(MethodName)] => BOOL


// Swift (uses an optional chaining to check the implementation)

if let result = instance?.method…

该原则允许使用方法,具体取决于它们在未知对象中的实现,但符合协议。

 // Objective C: example

if ([self.delegate respondsToSelector:@selector(methodA:)]) {
      res = [self.delegate methodA:param];

} else if ([self.delegate respondsToSelector:@selector(methodB)]) {
      res = [self.delegate methodB];

} …

 // Swift: example

 if let val = self.delegate?.methodA?(param) {
      res = val
} else if let val = self.delegate?.methodB {
      res = val
} …

JAVA不允许在界面中创建“可选”项目,但由于界面扩展,它允许执行非常类似的操作

interface ProtocolBase {}
interface PBMethodA extends ProtocolBase {
    type methodA(type Param);
}
interface PBMethodB extends ProtocolBase {
    type methodB();
}

 // Classes can then implement one or the other.

class Class1 implement PBMethodA {
    type methodA(type Param) {
    …
    }
}
class Class2 implement PBMethodB {
    type methodB() {
    …
    }
}

然后可以将实例作为ProtocolBase的“实例”进行测试,以查看对象是否符合“通用协议”,以及“子类协议”之一,以选择性地执行正确的方法。

虽然委托是Class1或Class2的实例,但它似乎是ProtocolBase的实例以及PBMethodA或PBMethodB的实例。所以

if (delegate instance of PBMethodA) {
    res = ((PBMethodA) delegate).methodA(param); 

} else if (dataSource instanceof PBMethodB) {
    res = ((PBMethodB) delegate).methodB();
}

希望这有帮助!