Flink не допускает установки неизменяемых стилей для объекта POJO при использовании классов случая Scala - PullRequest
1 голос
/ 11 октября 2019

Проблема, связанная с данной: https://issues.apache.org/jira/browse/FLINK-14380

При принятии решения о соответствии класса POJO с использованием средства извлечения типов Flink проверяет, реализует ли класс метод установки и получения. Для метода сеттера Флинк утверждает, что тип возвращаемого значения Void. Это проблема, если используется класс case, поскольку часто возвращаемый тип метода установки класса case является копией класса объектов. Рассмотрим следующий класс дел:

case class  SomeClass(x: Int) {
    x_=(newX: Int): SomeClass = { this.copy(x = newX) }
}

Этот класс будет определен как недопустимый POJO, хотя методы getter (генерируется) и setter предоставляются, потому что тип возвращаемого значения setter не void.

Эта проблема препятствует неизменности и делает невозможным использование классов дел без возврата к Kryo Serializer.

Проблема находится в https://github.com/apache/flink/blob/master/flink-core/src/main/java/org/apache/flink/api/java/typeutils/TypeExtractor.java в строке 1806. ВотПостоянная ссылка на строку

https://github.com/apache/flink/blob/80b27a150026b7b5cb707bd9fa3e17f565bb8112/flink-core/src/main/java/org/apache/flink/api/java/typeutils/TypeExtractor.java#L1806

Копия проверки здесь

if((methodNameLow.equals("set"+fieldNameLow) || methodNameLow.equals(fieldNameLow+"_$eq")) &&
                    m.getParameterTypes().length == 1 && // one parameter of the field's type
                    (m.getGenericParameterTypes()[0].equals( fieldType ) || (fieldTypeWrapper != null && m.getParameterTypes()[0].equals( fieldTypeWrapper )) || (fieldTypeGeneric != null && m.getGenericParameterTypes()[0].equals(fieldTypeGeneric) ) )&&
                    // return type is void.
                    m.getReturnType().equals(Void.TYPE)
                ) {
                    hasSetter = true;
                }
            }

Я считаю, что

m.getReturnType().equals(Void.TYPE)

должно бытьизменено на

m.getReturnType().equals(Void.TYPE) || m.getReturnType().equals(clazz)

Это позволит использовать установщики классов дел, которые возвращают копии объекта, позволяющие использовать классы дел. Это позволяет нам поддерживать неизменность без необходимости использовать Kryo Serializer.

Мне любопытно, как это изменение будет взаимодействовать с сериализатором и десериализатором. Я думаю, что сериализатор / десериализатор может использовать методы установки таким образом, что это невозможно. Если это тот случай, есть ли способ использовать классы случаев Scala для объектов стиля POJO во Flink?

...