У меня довольно сложный набор общих классов в Java. Например, у меня есть интерфейс
interface Doable<X,Y> {
X doIt(Y y);
}
и реализация
class DoableImpl implements Doable<Foo<Bar<Baz,Qux>>,Foo<Bar<Zot,Qux>>> {
Foo<Bar<Baz,Qux>> doIt(Foo<Bar<Zot,Qux>> fooBZQ) { ... }
}
В реальной реализации Doable
имеет довольно много методов, поэтому Foo<Bar<Baz,Qux>>
и т.д. появляются снова и снова.
(Верьте или нет, общие типы довольно болезненны, чем это. Я упростил их для примера.)
Я хотел бы упростить их, чтобы сохранить себя набрав и облегчить напряжение на моих глазах. Я хотел бы иметь простой "псевдоним типа" для Foo<Bar<Baz,Qux>>
и т.д., Например FooBBQ
и FooBZQ
.
Моя нынешняя идея - определить классы-оболочки:
class FooBBQ {
public static FooBBQ valueOf(Foo<Bar<Baz,Qux>> fooBBQ) {
return new FooBBQ(fooBBQ);
}
private Foo<Bar<Baz,Qux>> fooBBQ;
private FooBBQ(Foo<Bar<Baz,Qux>> fooBBQ) {
this.fooBBQ = fooBBQ;
}
public Foo<Bar<Baz,Qux>> toGeneric() {
return fooBBQ;
}
}
class FooBZQ { /* pretty much the same... */ }
class DoableImpl implements Doable<FooBBQ,FooBZQ> {
FooBBQ doIt(FooBZQ fooBZQ) { ... }
}
Это хорошо работает, но имеет несколько недостатков:
- Нам нужно определить отдельные обертки для каждого общего экземпляра. Классы-оболочки являются короткими и стилизованными, но я не могу определить способ их макроопределения.
-
У нас есть служебные данные перевода (концептуально, если не оперативно) вызова
valueOf
иtoGeneric
для преобразования междуFooBBQ
иFoo<Bar<Baz,Qux>>
. Например, еслиdoIt
вызывает некоторую библиотечную процедуру, которая ожидаетFoo<Bar<Zot,Qux>>
(что делает реальная реализация), мы получаем что-то вродеreturn FooBBQ.valueOf( libraryCall( fooBZQ.toGeneric() ) )
где мы первоначально имели бы
return libraryCall(fooBZQ);
Есть ли другой способ получить поведение типа "псевдоним", которое я хочу здесь? Возможно, используя некоторые сторонние инструменты для макросов? Или мне нужно принять, что мне придется много набирать, одним способом (используя общие типы в реализации) или другим (писать обертки для них)? Может быть, если это множество общих параметров, которые летают, это всего лишь плохая идея, и мне нужно переосмыслить проблему?
[UPDATE] ОК, я запрещаю дальнейшие ответы "не делай этого". Возьмите его как данность, что Foo<Bar<Baz,Qux>>
имеет истинную ценность в моей проблемной области (Пит Киркхам может быть прав, что у него достаточно значения, чтобы получить надлежащий класс-оболочку с описательным именем). Но это проблема программирования; не пытайтесь определить проблему.