diff --git a/versions-common/src/main/java/org/codehaus/mojo/versions/ordering/BoundArtifactVersion.java b/versions-common/src/main/java/org/codehaus/mojo/versions/ordering/BoundArtifactVersion.java index b98dc8511..981c3ac3f 100644 --- a/versions-common/src/main/java/org/codehaus/mojo/versions/ordering/BoundArtifactVersion.java +++ b/versions-common/src/main/java/org/codehaus/mojo/versions/ordering/BoundArtifactVersion.java @@ -56,7 +56,7 @@ public int compareTo(ArtifactVersion other) { return -1; } - return comparator.compareTo(new ComparableVersion(other.toString())); + return comparator.compareTo(ComparableVersion.of(other.toString())); } @Override diff --git a/versions-common/src/main/java/org/codehaus/mojo/versions/ordering/ComparableVersion.java b/versions-common/src/main/java/org/codehaus/mojo/versions/ordering/ComparableVersion.java index 38dcd7999..0b8695680 100644 --- a/versions-common/src/main/java/org/codehaus/mojo/versions/ordering/ComparableVersion.java +++ b/versions-common/src/main/java/org/codehaus/mojo/versions/ordering/ComparableVersion.java @@ -26,8 +26,10 @@ import java.util.List; import java.util.ListIterator; import java.util.Locale; +import java.util.Map; import java.util.Properties; import java.util.Stack; +import java.util.concurrent.ConcurrentHashMap; /** * Generic implementation of version comparison. @@ -37,6 +39,8 @@ * Note: The implementation of the maven core should be used. */ public class ComparableVersion implements Comparable { + private static final Map CACHE = new ConcurrentHashMap<>(); + private String value; private String canonical; @@ -283,7 +287,17 @@ public String toString() { } } - public ComparableVersion(String version) { + /** + * Get a ComparableVersion representing the version in a string. + */ + public static ComparableVersion of(String version) { + return CACHE.computeIfAbsent(version, ComparableVersion::new); + } + + /** + * Create a ComparableVersion from a string. Try to avoid using this and instead use the cache by calling {@link #of(String)} + */ + protected ComparableVersion(String version) { parseVersion(version); } diff --git a/versions-common/src/main/java/org/codehaus/mojo/versions/ordering/MavenVersionComparator.java b/versions-common/src/main/java/org/codehaus/mojo/versions/ordering/MavenVersionComparator.java index 2b6fde15f..96b0140c6 100644 --- a/versions-common/src/main/java/org/codehaus/mojo/versions/ordering/MavenVersionComparator.java +++ b/versions-common/src/main/java/org/codehaus/mojo/versions/ordering/MavenVersionComparator.java @@ -39,7 +39,7 @@ public int compare(ArtifactVersion o1, ArtifactVersion o2) { if (o1 instanceof BoundArtifactVersion) { return o1.compareTo(o2); } - return new ComparableVersion(o1.toString()).compareTo(new ComparableVersion(o2.toString())); + return ComparableVersion.of(o1.toString()).compareTo(ComparableVersion.of(o2.toString())); } /** diff --git a/versions-common/src/main/java/org/codehaus/mojo/versions/ordering/MercuryVersionComparator.java b/versions-common/src/main/java/org/codehaus/mojo/versions/ordering/MercuryVersionComparator.java index 2f6e4a8bf..8ee880928 100644 --- a/versions-common/src/main/java/org/codehaus/mojo/versions/ordering/MercuryVersionComparator.java +++ b/versions-common/src/main/java/org/codehaus/mojo/versions/ordering/MercuryVersionComparator.java @@ -40,7 +40,7 @@ public class MercuryVersionComparator extends AbstractVersionComparator { * {@inheritDoc} */ public int compare(ArtifactVersion o1, ArtifactVersion o2) { - return new ComparableVersion(o1.toString()).compareTo(new ComparableVersion(o2.toString())); + return ComparableVersion.of(o1.toString()).compareTo(ComparableVersion.of(o2.toString())); } protected int innerGetSegmentCount(ArtifactVersion v) {