Я иногда пишу классы, которые можно преобразовывать во что-то и из чего-то еще, и я привык писать его как нестатический метод для преобразования и статический метод для преобразования, например:
class A {
B toB() {...}
static A fromB(B b) {...}
}
или
class B {
void save(File f) {...}
static B load(File f) {...}
}
Раньше я думал, что это хороший и простой подход, но в последнее время меня раздражает статичность метода convert-from, например, если я хочу определить интерфейс для типов, которые могут быть преобразованы в и из - B
:
interface ConvertableToAndFromB {
B toB();
// ?
}
Итак, есть ли элегантный способ сделать это без преобразования - из статического, кроме перехода на Smalltalk?
EDIT
Чтобы уточнить, я понимаю, что могу добавить нестатический метод в интерфейсе, например ::
interface ConvertableToAndFromB {
B toB();
void fromB(B b);
}
или, если я хочу разрешить неизменяемые типы (спасибо Stripling):
interface ConvertableToAndFromB<T implements ConvertibleToAndFromB<T>> {
B toB();
T fromB(B b);
}
Но это потребует от меня создания нового A
, прежде чем я смогу его вызвать, как в:
A a = new A();
a.fromB(b);
или (для неизменяемого):
A a = new A();
a = a.fromB(b);
это то, чего я пытаюсь избежать (но без другого решения). Я просто надеюсь, что есть более хороший путь.