DATACMNS-855 - Prevent memory leak in SyntheticParameterizedType.
Added proper equals(…) and hashCode() methods to SyntheticParameterizedType to make sure instances created for the same type information and type parameters are considered equal.
This commit is contained in:
@@ -15,6 +15,10 @@
|
|||||||
*/
|
*/
|
||||||
package org.springframework.data.util;
|
package org.springframework.data.util;
|
||||||
|
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import lombok.NonNull;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
|
||||||
import java.beans.PropertyDescriptor;
|
import java.beans.PropertyDescriptor;
|
||||||
import java.lang.reflect.Constructor;
|
import java.lang.reflect.Constructor;
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
@@ -558,23 +562,12 @@ class TypeDiscoverer<S> implements TypeInformation<S> {
|
|||||||
* @author Oliver Gierke
|
* @author Oliver Gierke
|
||||||
* @since 1.11
|
* @since 1.11
|
||||||
*/
|
*/
|
||||||
|
@EqualsAndHashCode
|
||||||
|
@RequiredArgsConstructor
|
||||||
private static class SyntheticParamterizedType implements ParameterizedType {
|
private static class SyntheticParamterizedType implements ParameterizedType {
|
||||||
|
|
||||||
private final ClassTypeInformation<?> typeInformation;
|
private final @NonNull ClassTypeInformation<?> typeInformation;
|
||||||
private final List<TypeInformation<?>> typeParameters;
|
private final @NonNull List<TypeInformation<?>> typeParameters;
|
||||||
|
|
||||||
/**
|
|
||||||
* @param typeInformation must not be {@literal null}.
|
|
||||||
* @param typeParameters must not be {@literal null}.
|
|
||||||
*/
|
|
||||||
public SyntheticParamterizedType(ClassTypeInformation<?> typeInformation, List<TypeInformation<?>> typeParameters) {
|
|
||||||
|
|
||||||
Assert.notNull(typeInformation, "Type must not be null!");
|
|
||||||
Assert.notNull(typeParameters, "Type parameters must not be null!");
|
|
||||||
|
|
||||||
this.typeInformation = typeInformation;
|
|
||||||
this.typeParameters = typeParameters;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* (non-Javadoc)
|
* (non-Javadoc)
|
||||||
|
|||||||
@@ -382,6 +382,24 @@ public class ClassTypeInformationUnitTests {
|
|||||||
assertThat(property.specialize(from), is((TypeInformation) from));
|
assertThat(property.specialize(from), is((TypeInformation) from));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see DATACMNS-855
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
@SuppressWarnings("rawtypes")
|
||||||
|
public void specializedTypeEqualsAndHashCode() {
|
||||||
|
|
||||||
|
ClassTypeInformation<Foo> root = ClassTypeInformation.from(Foo.class);
|
||||||
|
TypeInformation<?> property = root.getProperty("abstractBar");
|
||||||
|
|
||||||
|
TypeInformation left = property.specialize(ClassTypeInformation.from(Bar.class));
|
||||||
|
TypeInformation right = property.specialize(ClassTypeInformation.from(Bar.class));
|
||||||
|
|
||||||
|
assertThat(left, is(right));
|
||||||
|
assertThat(right, is(left));
|
||||||
|
assertThat(left.hashCode(), is(right.hashCode()));
|
||||||
|
}
|
||||||
|
|
||||||
static class StringMapContainer extends MapContainer<String> {
|
static class StringMapContainer extends MapContainer<String> {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user