我想询问是否有可能有条件地实现接口,或者是否可以解决我想做的事情。我想创建两个接口LangA和LangB,它们只包含大量用于打印消息的字符串的最终变量。你可能想象LangA是一种语言而LangB是另一种语言。我想要的是让我的消息处理类根据系统的语言环境有条件地实现所需的接口。即使有一些自定义的图书馆,我也不知道这是否可行,所以如果没有,请解释我是否可以至少解决它。 (快速问题:在Scala中这可能吗?谢谢!)
我已经想到了一个可能的,但也许不是一个资源效率很高的工作流程,它将让类的构造函数检查语言环境并根据某些无方法类的值设置自己的决赛,这些类只会为每种语言提供最终结果(例如构造函数知道locale是locA所以它设置了决赛myF1 = LangA.myF1; myF2 = LangB.myF2;等等)提前谢谢!
答案 0 :(得分:2)
不,这是不可能的。
“类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;
}
}
答案 1 :(得分:1)
抱歉,这不是一个好的设计。如果您有大量消息,最好将它们存储在数据库中,并将它们缓存在一个对象中,以便在内存中查找它们。
长期以来,接口只保留常数的想法已经失去了信誉。
接口应该是关于分离方法和行为,而不是常量。
这些特定于语言环境的观点更强烈地指向数据库或消息包,或者 - 等待它 - Map
Property
个值Locale
作为关键字。
如果你必须坚持下去,你将有更好的机会而不是继承。您可以使用依赖注入引擎(如Spring的BeanFactory
。
除了您发布的想法之外的任何其他内容。