【问题标题】:conditional interface implementation条件接口实现
【发布时间】:2012-09-08 12:59:35
【问题描述】:

我想问是否有可能的方法来有条件地实现接口,或者是否可以解决我想要做的事情。我想制作两个接口 LangA 和 LangB ,它们只会保存大量的最终变量,这些变量是用于打印消息的字符串。正如您可能想象的那样,LangA 是一种语言,而 LangB 是另一种语言。我想要的是让我的消息处理类有条件地实现基于系统语言环境所需的接口。即使使用一些自定义库,我也不知道这是否有可能,所以如果没有,请解释我是否至少可以解决它。 (快速提问:这在 Scala 中可行吗?谢谢!)
我想到了一个可能的,但可能不是一个非常节省资源的workaraound,它将让类的构造函数检查语言环境并根据某些无方法类的值设置自己的final,该类仅具有每种语言的final(例如构造函数知道语言环境是 locA,所以它设置 finals myF1=LangA.myF1; myF2=LangB.myF2; 等等)提前致谢!

【问题讨论】:

  • Interface with only constants 的可能重复项
  • @duffymo 我认为不是,因为他在问是否应该避免使用 ConstantInterfaceAntippattern,而我在问我是否可以有条件地实现一个接口。顺便说一句,就 Antippattern 而言,我必须为多个类实现接口,但为了便于解释,我只指一个类!
  • 我意识到这一点。你不应该这样做,一个或多个班级。完全错了。

标签: java class interface locale


【解决方案1】:

不,这是不可能的。

“类 X 实现接口 Y” 关系在编译时是固定的,不能在运行时改变。

但是,使用接口将常量导入类是一种可以追溯到 Java 1.0 的解决方案。 This anti-pattern should not be used for new development.

此外,使用编译时常量进行本地化不是 Java 中的本机解决方案。你应该localize using resource bundles

如果您需要一种在运行时切换实现的方法,请将常量替换为接口中的方法,并提供返回不同常量的实现:

 interface Constants {
     double getAccelerationDueToGravity();
 }

 class EarthConstants implements Constants {
     double getAccelerationDueToGravity() {
         return 9.8;
     }
 }

 class MarsConstants implements Constants {
     double getAccelerationDueToGravity() {
         return 3.71;
     }
 }

【讨论】:

  • 我想将相同的常量列表导入 10 多个类,我只提到了一个,我知道这是一个反模式!感谢您的快速回复! :)
【解决方案2】:

抱歉,这不是一个好的设计。如果您有大量消息,最好将它们存储在数据库中并将它们缓存在一个对象中,以便您在内存中查找它们。

接口只包含常量的想法长期以来一直受到质疑。

接口应该是关于分离方法和行为,而不是常量。

认为这些是特定于语言环境的点对数据库或消息包的影响更大,或者 - 等待它 - 以 Locale 为键的 Property 值中的 Map

如果你必须坚持,那么你将有更好的机会使用组合而不是继承。您可以使用 Spring 的 BeanFactory 等依赖注入引擎向对象注入所需的消息。

除了您发布的想法之外的任何内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-03
    • 2016-06-20
    • 2022-01-15
    • 2013-09-25
    • 2011-08-28
    • 2014-08-21
    相关资源
    最近更新 更多