Есть ли лучший способ создания возвращаемого объекта для приведенного ниже метода?
Это типа <T>
.
Первый параметр input
имеет тот же тип, что и возвращаемый объект.
Меня беспокоит последний параметр builder
.
В настоящее время он указывает на статический фабричный метод в каждом классе T.
Если бы вы хотели избежать передачи параметра builder
, как бы вы с этим справились?
(Я бы предпочел не прибегать к приведению типов и использовать метод, дружественный к неизменяемым объектам.)
public <T extends FourVector> T transformVector(T input, TransformInto direction, Function<Map<Axis, Double>, T> builder) {
//the core calculation uses matrices, so we convert back and forth like so
Matrix input_matrix = Matrix.asMatrix(input);
Matrix result = physicsMatrix(direction.sign()).times(input_matrix);
//I need to build a new T object here; hence the builder param
return builder.apply(asComponents(result));
}
Λ
и ваш Builder чрезвычайно сложно напечатать.
Лямбда соответствует физическим формулам преобразования Лоренца. Вот и все.
Ваше решение выглядит оптимальным. В общем, лучшего способа создания универсальных типов не существует.
Это можно сделать с помощью некоторого отражения и неконтролируемых приведений. Вы бы предпочли это вашему нынешнему подходу? Я бы не стал.
Я изменил необычное имя метода.
Я экспериментировал примерно с 6 различными вариантами.
Лучшее, что я смог придумать, — это создать явный Builder
интерфейс для создания желаемого объекта.
Основная идея заключается в том, что входящий объект input
уже имеет правильный тип T, поэтому имеет смысл попросить этот объект построить новый объект того же типа T.
private <T extends FourVector & Builder<T>> T transformVector(T input, TransformInto direction) {
//the core calculation uses matrices, so we convert back and forth like so
Matrix input_matrix = Matrix.asMatrix(input);
Matrix output_matrix = lambdaMatrix(direction.sign()).times(input_matrix);
return input.build(fromComponents(output_matrix));
}
Используя интерфейс Builder
в качестве переводчика из структуры данных более низкого уровня в желаемую структуру данных более высокого уровня:
public interface Builder<T> {
/** Build a new T object out of the given components. */
public T build(Map<Axis, Double> components);
}
Необычным здесь является то, что создание объекта происходит не с помощью конструктора, а с помощью обычного метода объекта.
Вы написали функцию с именем
Λ
? Почему? Может быть, дайтеFourVector
методasMatrix()
. И переименуйтеΛ
.