From 1091452df4174e59cdf586ecceb3b59c9e99c244 Mon Sep 17 00:00:00 2001 From: Oleksandr Buhaiov Date: Wed, 8 Apr 2026 20:14:38 +0300 Subject: [PATCH] Speedup Version(short, short, short, string) constructor lazily evaluate version's string value, so that concatenation is not invoked during constructor invocation --- .../epam/jsdmx/infomodel/sdmx30/Version.java | 25 +++++++++++-------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/sdmx30-infomodel/src/main/java/com/epam/jsdmx/infomodel/sdmx30/Version.java b/sdmx30-infomodel/src/main/java/com/epam/jsdmx/infomodel/sdmx30/Version.java index 29979c7..37e471b 100644 --- a/sdmx30-infomodel/src/main/java/com/epam/jsdmx/infomodel/sdmx30/Version.java +++ b/sdmx30-infomodel/src/main/java/com/epam/jsdmx/infomodel/sdmx30/Version.java @@ -1,6 +1,7 @@ package com.epam.jsdmx.infomodel.sdmx30; import java.util.Arrays; +import java.util.Objects; import java.util.Optional; import java.util.regex.Pattern; @@ -20,10 +21,11 @@ public class Version { public static final Pattern PATTERN = Pattern.compile("\\d+\\.\\d+(\\.\\d+(-\\w+)?)?"); - private final String value; private final short[] componentsArray; private final String extension; + private String value; + public Version(Version other) { this.value = other.value; this.componentsArray = Arrays.copyOf(other.componentsArray, other.componentsArray.length); @@ -38,7 +40,6 @@ private Version(String version) { private Version(short major, short minor, short patch, String extension) { validateComponents(major, minor, patch); - this.value = major + "." + minor + "." + patch + (StringUtils.isNotEmpty(extension) ? "-" + extension : ""); this.componentsArray = new short[]{major, minor, patch}; this.extension = extension; } @@ -85,7 +86,11 @@ private short[] splitIntoComponents(String version) { } public String getValue() { - return this.value; + if (this.value == null) { + // may be null only for 3-component version + value = componentsArray[0] + "." + componentsArray[1] + "." + componentsArray[2] + (StringUtils.isNotEmpty(extension) ? "-" + extension : ""); + } + return value; } public short getMajor() { @@ -120,25 +125,23 @@ public boolean isStable() { @Override public String toString() { - return value; + return getValue(); } @Override public boolean equals(Object o) { - if (this == o) { - return true; - } - if (!(o instanceof Version)) { + if (o == null || getClass() != o.getClass()) { return false; } Version version = (Version) o; - - return value.equals(version.value); + return Arrays.equals(componentsArray, version.componentsArray) && Objects.equals(extension, version.extension); } @Override public int hashCode() { - return value.hashCode(); + int result = Arrays.hashCode(componentsArray); + result = 31 * result + Objects.hashCode(extension); + return result; } }