[ https://issues.apache.org/jira/browse/FLINK-14380?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16960175#comment-16960175 ]
Marco Zühlke commented on FLINK-14380: -------------------------------------- A pull request in line with the suggestion by [~aljoscha]: https://github.com/apache/flink/pull/9999 > Type Extractor POJO setter check does not allow for Immutable Case Class > ------------------------------------------------------------------------ > > Key: FLINK-14380 > URL: https://issues.apache.org/jira/browse/FLINK-14380 > Project: Flink > Issue Type: Bug > Components: API / Scala > Affects Versions: 1.8.2, 1.9.0 > Environment: Not relavent > > Reporter: Elliot Pourmand > Priority: Major > Labels: pull-request-available > Time Spent: 20m > Remaining Estimate: 0h > > When deciding if a class conforms to POJO using the type extractor Flink > checks that the class implements a setter and getter method. For the setter > method Flink makes the assertion that the return type is `Void`. This is an > issue if using a case class as often the return type of a case class setter > is a copy of the objects class. Consider the following case class: > {code:scala} > case class SomeClass(x: Int) { > x_=(newX: Int): SomeClass = { this.copy(x = newX) } > } > {code} > This class will be identified as not being valid POJO although getter > (generated) and setter methods are provided because the return type of the > setter is not void. > This issue discourages immutabilaty and makes the usage of case classes not > possible without falling back to Kryo Serializer. > The issue is located in > https://github.com/apache/flink/blob/master/flink-core/src/main/java/org/apache/flink/api/java/typeutils/TypeExtractor.java > on line 1806. Here is a permalink to the line > https://github.com/apache/flink/blob/80b27a150026b7b5cb707bd9fa3e17f565bb8112/flink-core/src/main/java/org/apache/flink/api/java/typeutils/TypeExtractor.java#L1806 > A copy of the if check is here > {code:java} > 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; > } > } > {code} > I believe the > {code:java} > m.getReturnType().equals(Void.TYPE) > {code} > should be modified to > {code:java} > m.getReturnType().equals(Void.TYPE) || m.getReturnType().equals(clazz) > {code} > This will allow for case class setters which return copies of the object > enabling to use case classes. This allows us to maintain immutability without > being forced to fall back to the Kryo Serializer. -- This message was sent by Atlassian Jira (v8.3.4#803005)