我想问是否有可能的方法来有条件地实现接口,或者是否可以解决我想要做的事情。我想制作两个接口 LangA 和 LangB ,它们只会保存大量的最终变量,这些变量是用于打印消息的字符串。正如您可能想象的那样,LangA 是一种语言,而 LangB 是另一种语言。我想要的是让我的消息处理类有条件地实现基于系统语言环境所需的接口。即使使用一些自定义库,我也不知道这是否有可能,所以如果没有,请解释我是否至少可以解决它。(快速提问:这在 Scala 中可行吗?谢谢!)
我想到了一个可能的,但可能不是一个非常节省资源的workaraound,它将让类的构造函数检查语言环境并根据某些无方法类的值设置自己的final,该类仅具有每种语言的final(例如构造函数知道语言环境是 locA 所以它设置决赛 myF1=LangA.myF1; myF2=LangB.myF2; 等等)提前致谢!
问问题
2347 次
2 回答
2
不,这是不可能的。
“类 X 实现接口 Y”的关系在编译时是固定的,不能在运行时更改。
但是,使用接口将常量导入类是一种可以追溯到 Java 1.0 的解决方案。这种反模式不应该用于新的开发。
此外,使用编译时常量进行本地化并不是Java 的原生解决方案。您应该使用资源包进行本地化。
如果您需要一种在运行时切换实现的方法,请将常量替换为接口中的方法,并提供返回不同常量的实现:
interface Constants {
double getAccelerationDueToGravity();
}
class EarthConstants implements Constants {
double getAccelerationDueToGravity() {
return 9.8;
}
}
class MarsConstants implements Constants {
double getAccelerationDueToGravity() {
return 3.71;
}
}
于 2012-09-08T13:02:53.790 回答
1
抱歉,这不是一个好的设计。如果您有大量消息,最好将它们存储在数据库中并将它们缓存在一个对象中,以便您在内存中查找它们。
接口只包含常量的想法长期以来一直受到质疑。
接口应该是关于分离方法和行为,而不是常量。
认为这些是特定于语言环境的点对数据库或消息包或 - 等待它 - 以作为键 Map
的Property
值更强烈的想法。Locale
如果你必须坚持,你将有比继承更好的机会组合。您可以使用 Spring 之类的依赖注入引擎向对象注入所需的消息BeanFactory
。
除了您发布的想法之外的任何内容。
于 2012-09-08T13:02:41.293 回答