我有一个包含多个方法定义的界面,我会不喜欢要求其中的一些。
这可能吗?如果是这样,我该如何实现呢?
我尝试设置@Optional
的注释,但这似乎不起作用。
我是否必须在某处定义Optional
注释?
答案 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();
}
希望这有帮助!