【发布时间】:2011-02-17 20:40:07
【问题描述】:
在 Java 中,我希望能够定义标记接口,强制实现提供静态方法。例如,对于简单的文本序列化/反序列化,我希望能够定义一个看起来像这样的接口:
public interface TextTransformable<T>{
public static T fromText(String text);
public String toText();
由于 Java 中的接口不能包含静态方法(如许多其他帖子/线程中所述:here、here 和 here,此代码不起作用。
然而,我正在寻找一些合理的范式来表达相同的意图,即对称方法,其中一个是静态的,由编译器强制执行。目前我们能想到的最好的方法是某种静态工厂对象或泛型工厂,这两者都不是真正令人满意的。
注意:在我们的例子中,我们的主要用例是我们有很多很多“值对象”类型 - 枚举或其他具有有限数量值的对象,通常不携带超出其值的状态,我们每秒解析/反解析数千次,因此实际上要关心重用实例(如 Float、Integer 等)及其对内存消耗/gc 的影响
有什么想法吗?
EDIT1:为了消除一些困惑 - 我们有许多不同的对象适合这种模式 - 实际上我们正在尝试为具有 2 种语义的调用者提供一些优雅的东西:
- 接口作为契约 - 访问的统一(例如 TextTransformable 作为一种能力)
- 要求通过子类/实现来实现(例如,强制它们实现自己的转换
就我们对享元、工厂的想法而言——它们都是我们考虑过的选项,实际上我们正在尝试看看是否能找到比依赖 JavaDoc 说“实现工厂和委托调用”更优雅的东西给它,或者按照约定在 XXX 位置暴露它”
【问题讨论】: