Есть ли лучший способ создания этого объекта <T>?

Есть ли лучший способ создания возвращаемого объекта для приведенного ниже метода? Это типа <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));
}

Вы написали функцию с именем Λ? Почему? Может быть, дайте FourVector метод asMatrix(). И переименуйте Λ.

Elliott Frisch 15.08.2024 01:06
Λ и ваш Builder чрезвычайно сложно напечатать.
Jeff Bowman 15.08.2024 01:16

Лямбда соответствует физическим формулам преобразования Лоренца. Вот и все.

John 15.08.2024 02:12

Ваше решение выглядит оптимальным. В общем, лучшего способа создания универсальных типов не существует.

Louis Wasserman 15.08.2024 02:57

Это можно сделать с помощью некоторого отражения и неконтролируемых приведений. Вы бы предпочли это вашему нынешнему подходу? Я бы не стал.

Sweeper 15.08.2024 04:45

Я изменил необычное имя метода.

John 15.08.2024 16:38
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
6
79
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я экспериментировал примерно с 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);

}

Необычным здесь является то, что создание объекта происходит не с помощью конструктора, а с помощью обычного метода объекта.

Другие вопросы по теме