Java:接口中的受保护方法

K J*_*K J 5 java oop access-modifiers

好吧,我知道这个问题已经被问过几次了,但我需要针对我的具体情况的建议。有 Encodable 和 Decodable 之分,消息既是 Encodable 又是 Decodable:

interface Encodable { void encode(); }
interface Decodable { void decode(); }
class Message implements Encodable, Decodable { ... }

void processEncodable(Encodable encodable) {
  ...
  encodable.encode();
  ...
}
Run Code Online (Sandbox Code Playgroud)

除了 Message 之外,还有其他 Encodable(和 Decodable),它们需要在 processEncodable 中进行处理。到目前为止一切顺利,但问题是我想从包外部隐藏encode()和decode(),并且Java接口不允许受保护/私有方法。有人可能会建议抽象类,但正如您所看到的,Message 应该同时继承 Encodable 和 Decodable,所以情况并非如此。有什么建议么?

这些天我非常喜欢 Scala,Scala 特征允许受保护/私有方法,恕我直言,这更直观。我已经浏览了一些提到Java接口设计理念的答案,但我真的不明白为什么如果引入接口作为多重继承的替代方案,那么它不应该允许受保护的方法,而抽象类则允许......

Fri*_*itz 3

作为替代品并不意味着它是完全替代品。接口是服务契约,因此它们公开了某个类向其客户端提供的功能,任何人都可以访问该接口。

如果您想隐藏encodedecode从包外部(这意味着您的逻辑也应该与类一起保留在包中Message),请不要通过接口公开它们,而是允许它们成为您的protected(或包私有Message)方法类(或超类,如果各种类都是可编码/可解码的)。

这不是一个孤立的规则。有一些机制可以在不破坏接口概念的情况下实现您想要的目标。想一想:如果只能在包内访问该方法,那么该方法对接口有什么好处呢?如果这些方法可以是类方法,并且也可供具有适当修饰符的包成员使用,那么在接口中拥有此类方法有什么意义呢?