В Java я хотел бы иметь возможность определять интерфейсы маркеров, которые принудительно реализуют статические методы. Например, для простой сериализации/десериализации сериализации я хотел бы определить интерфейс, который выглядит примерно так:
public interface TextTransformable<T>{
public static T fromText(String text);
public String toText();
Так как интерфейсы в Java не могут содержать статические методы (как указано в ряде других сообщений/потоков: здесь, здесь, и здесь этот код не работает.
Тем не менее, я ищу некоторую разумную парадигму, чтобы выразить одно и то же намерение, а именно симметричные методы, один из которых является статичным и принудительно выполняется компилятором. Сейчас самое лучшее, что мы можем придумать, это какой-то статический объект factory или общий factory, ни один из которых не является действительно удовлетворительным.
Примечание: в нашем случае наш основной случай использования состоит в том, что у нас есть много, много типов "value-object" - перечисления или другие объекты, которые имеют ограниченное число значений, как правило, не имеют состояния, превышающего их значение, и которое мы parse/de-parse тысячи раз в секунду, поэтому на самом деле заботиться о повторном использовании экземпляров (например, Float, Integer и т.д.) и его влиянии на потребление памяти /gc
Любые мысли?
EDIT1: Чтобы устранить некоторую путаницу - у нас есть много разных объектов, соответствующих этому шаблону - мы стараемся придумать что-то элегантное для звонящих с 2 семантикой:
- Интерфейсы как контракты - единство доступа (например, TextTransformable как возможность)
- Требуется реализация подклассами/реализациями (например, заставить их реализовать свое собственное преобразование
С точки зрения наших мыслей о Flyweight, Factories - они оба варианта, которые мы рассмотрели, действительно мы пытаемся понять, можем ли мы найти что-то более элегантное, чем полагаться на JavaDoc, говорящий "реализовать factory и делегировать на него делегат или выставлять его в местоположении XXX по соглашению"