From: Robert Varga Date: Wed, 14 May 2014 07:17:51 +0000 (+0200) Subject: BUG-987: improve generated type allocation X-Git-Tag: release/helium~544^2 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=refs%2Fchanges%2F87%2F6987%2F3;p=yangtools.git BUG-987: improve generated type allocation This patch improves ArrayList allocation such it does not waste space in generated types, since we know how big an array we need before hand. We also use singletonList() and emptyList() as appropriate. Shaves off about 2MB from retained size on a vanilla SP edition. Change-Id: Ief18a029613f14c13abc985aa60388b704bae79e Signed-off-by: Robert Varga --- diff --git a/code-generator/binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/generated/type/builder/AbstractGeneratedType.java b/code-generator/binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/generated/type/builder/AbstractGeneratedType.java index eefb847ff6..a2bc6da939 100644 --- a/code-generator/binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/generated/type/builder/AbstractGeneratedType.java +++ b/code-generator/binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/generated/type/builder/AbstractGeneratedType.java @@ -39,13 +39,13 @@ abstract class AbstractGeneratedType extends AbstractBaseType implements Generat private final List properties; private final boolean isAbstract; - public AbstractGeneratedType(AbstractGeneratedTypeBuilder builder) { + public AbstractGeneratedType(final AbstractGeneratedTypeBuilder builder) { super(builder.getPackageName(), builder.getName()); this.parent = builder.getParent(); this.comment = builder.getComment(); this.annotations = toUnmodifiableAnnotations(builder.getAnnotations()); - this.implementsTypes = Collections.unmodifiableList(builder.getImplementsTypes()); - this.constants = Collections.unmodifiableList(builder.getConstants()); + this.implementsTypes = makeUnmodifiable(builder.getImplementsTypes()); + this.constants = makeUnmodifiable(builder.getConstants()); this.enumerations = toUnmodifiableEnumerations(builder.getEnumerations()); this.methodSignatures = toUnmodifiableMethods(builder.getMethodDefinitions()); this.enclosedTypes = toUnmodifiableEnclosedTypes(builder.getEnclosedTypes(), @@ -64,19 +64,29 @@ abstract class AbstractGeneratedType extends AbstractBaseType implements Generat this.parent = parent; this.comment = comment; this.annotations = toUnmodifiableAnnotations(annotationBuilders); - this.implementsTypes = Collections.unmodifiableList(implementsTypes); - this.constants = Collections.unmodifiableList(constants); + this.implementsTypes = makeUnmodifiable(implementsTypes); + this.constants = makeUnmodifiable(constants); this.enumerations = toUnmodifiableEnumerations(enumBuilders); this.methodSignatures = toUnmodifiableMethods(methodBuilders); this.enclosedTypes = toUnmodifiableEnclosedTypes(enclosedGenTypeBuilders, enclosedGenTOBuilders); this.properties = toUnmodifiableProperties(propertyBuilders); this.isAbstract = isAbstract; + } + protected static final List makeUnmodifiable(final List list) { + switch (list.size()) { + case 0: + return Collections.emptyList(); + case 1: + return Collections.singletonList(list.get(0)); + default: + return Collections.unmodifiableList(list); + } } - private List toUnmodifiableEnclosedTypes(final List enclosedGenTypeBuilders, + private static List toUnmodifiableEnclosedTypes(final List enclosedGenTypeBuilders, final List enclosedGenTOBuilders) { - final List enclosedTypesList = new ArrayList<>(); + final ArrayList enclosedTypesList = new ArrayList<>(enclosedGenTypeBuilders.size() + enclosedGenTOBuilders.size()); for (final GeneratedTypeBuilder builder : enclosedGenTypeBuilders) { if (builder != null) { enclosedTypesList.add(builder.toInstance()); @@ -88,39 +98,40 @@ abstract class AbstractGeneratedType extends AbstractBaseType implements Generat enclosedTypesList.add(builder.toInstance()); } } - return enclosedTypesList; + + return makeUnmodifiable(enclosedTypesList); } - protected final List toUnmodifiableAnnotations(final List annotationBuilders) { - final List annotationList = new ArrayList<>(); + protected static final List toUnmodifiableAnnotations(final List annotationBuilders) { + final List annotationList = new ArrayList<>(annotationBuilders.size()); for (final AnnotationTypeBuilder builder : annotationBuilders) { annotationList.add(builder.toInstance()); } - return Collections.unmodifiableList(annotationList); + return makeUnmodifiable(annotationList); } - protected final List toUnmodifiableMethods(List methodBuilders) { - final List methods = new ArrayList<>(); + protected final List toUnmodifiableMethods(final List methodBuilders) { + final List methods = new ArrayList<>(methodBuilders.size()); for (final MethodSignatureBuilder methodBuilder : methodBuilders) { methods.add(methodBuilder.toInstance(this)); } - return Collections.unmodifiableList(methods); + return makeUnmodifiable(methods); } - protected final List toUnmodifiableEnumerations(List enumBuilders) { - final List enums = new ArrayList<>(); + protected final List toUnmodifiableEnumerations(final List enumBuilders) { + final List enums = new ArrayList<>(enumBuilders.size()); for (final EnumBuilder enumBuilder : enumBuilders) { enums.add(enumBuilder.toInstance(this)); } - return Collections.unmodifiableList(enums); + return makeUnmodifiable(enums); } - protected final List toUnmodifiableProperties(List methodBuilders) { - final List methods = new ArrayList<>(); + protected final List toUnmodifiableProperties(final List methodBuilders) { + final List methods = new ArrayList<>(methodBuilders.size()); for (final GeneratedPropertyBuilder methodBuilder : methodBuilders) { methods.add(methodBuilder.toInstance(this)); } - return Collections.unmodifiableList(methods); + return makeUnmodifiable(methods); } @Override diff --git a/code-generator/binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/generated/type/builder/AbstractTypeMember.java b/code-generator/binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/generated/type/builder/AbstractTypeMember.java index 5172188288..cfadce1a5e 100644 --- a/code-generator/binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/generated/type/builder/AbstractTypeMember.java +++ b/code-generator/binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/generated/type/builder/AbstractTypeMember.java @@ -29,11 +29,11 @@ abstract class AbstractTypeMember implements TypeMember { public AbstractTypeMember(final Type definingType, final String name, final List annotations, final String comment, final AccessModifier accessModifier, final Type returnType, - boolean isFinal, boolean isStatic) { + final boolean isFinal, final boolean isStatic) { super(); this.definingType = definingType; this.name = name; - this.annotations = Collections.unmodifiableList(annotations); + this.annotations = annotations.isEmpty() ? Collections.emptyList() : Collections.unmodifiableList(annotations); this.comment = comment; this.accessModifier = accessModifier; this.returnType = returnType; @@ -92,7 +92,7 @@ abstract class AbstractTypeMember implements TypeMember { } @Override - public boolean equals(Object obj) { + public boolean equals(final Object obj) { if (this == obj) { return true; } diff --git a/code-generator/binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/generated/type/builder/GeneratedTOBuilderImpl.java b/code-generator/binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/generated/type/builder/GeneratedTOBuilderImpl.java index a2ecc1018d..b3b1c7ce25 100644 --- a/code-generator/binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/generated/type/builder/GeneratedTOBuilderImpl.java +++ b/code-generator/binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/generated/type/builder/GeneratedTOBuilderImpl.java @@ -23,16 +23,16 @@ public final class GeneratedTOBuilderImpl extends AbstractGeneratedTypeBuilder equalsProperties = new ArrayList<>(); - private final List hashProperties = new ArrayList<>(); - private final List toStringProperties = new ArrayList<>(); + private final ArrayList equalsProperties = new ArrayList<>(); + private final ArrayList hashProperties = new ArrayList<>(); + private final ArrayList toStringProperties = new ArrayList<>(); private boolean isTypedef = false; private boolean isUnionType = false; private boolean isUnionTypeBuilder = false; private Restrictions restrictions; private GeneratedPropertyBuilder SUID; - public GeneratedTOBuilderImpl(String packageName, String name) { + public GeneratedTOBuilderImpl(final String packageName, final String name) { super(packageName, name); setAbstract(false); } @@ -61,26 +61,26 @@ public final class GeneratedTOBuilderImpl extends AbstractGeneratedTypeBuildernew instance of Method Signature Builder. */ @Override - public MethodSignatureBuilder addMethod(String name) { + public MethodSignatureBuilder addMethod(final String name) { final MethodSignatureBuilder builder = super.addMethod(name); builder.setAbstract(false); return builder; } @Override - public GeneratedTOBuilder addEqualsIdentity(GeneratedPropertyBuilder property) { + public GeneratedTOBuilder addEqualsIdentity(final GeneratedPropertyBuilder property) { equalsProperties.add(property); return this; } @Override - public GeneratedTOBuilder addHashIdentity(GeneratedPropertyBuilder property) { + public GeneratedTOBuilder addHashIdentity(final GeneratedPropertyBuilder property) { hashProperties.add(property); return this; } @Override - public GeneratedTOBuilder addToStringProperty(GeneratedPropertyBuilder property) { + public GeneratedTOBuilder addToStringProperty(final GeneratedPropertyBuilder property) { toStringProperties.add(property); return this; } @@ -91,17 +91,18 @@ public final class GeneratedTOBuilderImpl extends AbstractGeneratedTypeBuilder