Java接口中的可选方法

Java接口中的可选方法,java,android,interface,Java,Android,Interface,我有一个带有多个方法定义的接口,我想不需要一些方法定义 这可能吗?如果是,我该如何实施 我已尝试设置@可选的注释,但这似乎不起作用 我必须在某处定义可选的注释吗?Java中没有@可选的注释。您可以做的一件事是创建一个接口,然后创建一个提供存根实现的抽象类。然后,您的类可以扩展这个基类并覆盖它们感兴趣的方法。您可以拥有一个抽象类,该抽象类使用空函数实现来实现这个接口,然后从抽象类进行扩展 话虽如此,我想问你为什么要这样做。也许您需要将接口拆分为多个较小的接口,并实现类所需的唯一接口尽管我同意其他答

我有一个带有多个方法定义的接口,我想需要一些方法定义

这可能吗?如果是,我该如何实施

我已尝试设置
@可选
的注释,但这似乎不起作用


我必须在某处定义
可选的
注释吗?

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

您可以拥有一个抽象类,该抽象类使用空函数实现来实现这个接口,然后从抽象类进行扩展


话虽如此,我想问你为什么要这样做。也许您需要将接口拆分为多个较小的接口,并实现类所需的唯一接口

尽管我同意其他答案,但应该注意,JDK中存在此类可选方法。例如,是可选的。如果不想实现此方法,则实现必须抛出UnsupportedOperationException

如果希望能够知道是否实现了可选方法,则可以添加另一个方法(非可选):

Erik说:“从概念上讲,如果你不能依赖它提供的合同,那么接口有什么好处呢?”

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

在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
 // 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
} …
可以检查方法(包括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

[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
 // 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();
}

希望这有帮助

听起来你需要做几个接口——从概念上讲,如果你不能依赖接口提供的契约,那么接口有什么好处。这完全破坏了接口的整体意义。除非您希望让编译器通过检查所有实现的重写来决定接口是否应该在编译时使用该方法。。。。是的,不,糟糕idea@Spidy”“我认为不是。在Objective-C中,使用可选接口方法的模式非常普遍,而且非常有效。可选方法可能是不可行的。这正是我想要实现的。我喜欢在cocoa touch/objective-c中,我只需指定
@optional
@required
,并在调用iti之前测试对象是否响应此类方法。我猜想这是有意义的,这样您就不必提供一个具有默认空行为的抽象实现
java.awt.event.MouseAdapter
为什么要用抽象类实现接口?我不能用普通类实现吗?@MartinChekurov你也可以用普通类实现,但代码的用户可以实例化它。如果这不是问题,那当然!我想保持它的抽象性,以确保人们明白,在它被充分利用之前,他们还有工作要做。。。。else if(委托PBMethodB的实例)。。。我猜?为什么要用抽象类实现接口?我不能用普通类实现吗?