3131 *
3232 * @see <a href="https://semver.org/">Semantic Versioning 2.0.0</a>
3333 */
34- public class SemVer {
34+ class SemVer {
3535
3636 /**
3737 * Regex pattern for parsing semantic versions from semver.org.
@@ -67,7 +67,7 @@ public enum Element {
6767 * @param preRelease the pre-release identifier (can be null)
6868 * @param metadata the build metadata (can be null)
6969 */
70- public SemVer (int major , int minor , int patch , String preRelease , String metadata ) {
70+ protected SemVer (int major , int minor , int patch , String preRelease , String metadata ) {
7171 if (major < 0 || minor < 0 || patch < 0 ) {
7272 throw new IllegalArgumentException ("Version numbers must be non-negative" );
7373 }
@@ -85,7 +85,7 @@ public SemVer(int major, int minor, int patch, String preRelease, String metadat
8585 * @return the parsed SemVer object
8686 * @throws IllegalArgumentException if the version string is invalid
8787 */
88- public static SemVer parse (String version ) {
88+ static SemVer parse (String version ) {
8989 if (version == null || version .trim ().isEmpty ()) {
9090 throw new IllegalArgumentException ("Version string cannot be null or empty" );
9191 }
@@ -116,7 +116,7 @@ public static SemVer parse(String version) {
116116 *
117117 * @return a new SemVer representing the release version
118118 */
119- public SemVer toReleaseVersion () {
119+ SemVer toReleaseVersion () {
120120 return new SemVer (major , minor , patch , null , null );
121121 }
122122
@@ -133,9 +133,12 @@ public SemVer toReleaseVersion() {
133133 * <li>1.2.3-SNAPSHOT → 1.2.3-SNAPSHOT (no change)</li>
134134 * </ul>
135135 *
136- * @return a new SemVer with SNAPSHOT pre-release identifier
136+ * @return a new SemVer with SNAPSHOT pre-release identifier, or this instance if already a SNAPSHOT version
137137 */
138- public SemVer toSnapshotVersion () {
138+ SemVer toSnapshotVersion () {
139+ if ("SNAPSHOT" .equals (preRelease ) && metadata == null ) {
140+ return this ;
141+ }
139142 return new SemVer (major , minor , patch , "SNAPSHOT" , null );
140143 }
141144
@@ -148,7 +151,7 @@ public SemVer toSnapshotVersion() {
148151 * @param element the element to increment (MAJOR, MINOR, or PATCH)
149152 * @return a new SemVer with the specified element incremented (or release version if pre-release/metadata present)
150153 */
151- public SemVer next (Element element ) {
154+ SemVer next (Element element ) {
152155 Objects .requireNonNull (element , "Element cannot be null" );
153156
154157 // If version has pre-release or metadata, just return release version without incrementing
@@ -173,7 +176,7 @@ public SemVer next(Element element) {
173176 *
174177 * @return true if pre-release identifier is present, false otherwise
175178 */
176- public boolean hasPreRelease () {
179+ private boolean hasPreRelease () {
177180 return preRelease != null && !preRelease .isEmpty ();
178181 }
179182
@@ -182,7 +185,7 @@ public boolean hasPreRelease() {
182185 *
183186 * @return true if build metadata is present, false otherwise
184187 */
185- public boolean hasMetadata () {
188+ private boolean hasMetadata () {
186189 return metadata != null && !metadata .isEmpty ();
187190 }
188191
@@ -191,7 +194,7 @@ public boolean hasMetadata() {
191194 *
192195 * @return the major version
193196 */
194- public int getMajor () {
197+ int getMajor () {
195198 return major ;
196199 }
197200
@@ -200,7 +203,7 @@ public int getMajor() {
200203 *
201204 * @return the minor version
202205 */
203- public int getMinor () {
206+ int getMinor () {
204207 return minor ;
205208 }
206209
@@ -209,7 +212,7 @@ public int getMinor() {
209212 *
210213 * @return the patch version
211214 */
212- public int getPatch () {
215+ int getPatch () {
213216 return patch ;
214217 }
215218
@@ -218,7 +221,7 @@ public int getPatch() {
218221 *
219222 * @return the pre-release identifier, or null if not present
220223 */
221- public String getPreRelease () {
224+ String getPreRelease () {
222225 return preRelease ;
223226 }
224227
@@ -227,7 +230,7 @@ public String getPreRelease() {
227230 *
228231 * @return the build metadata, or null if not present
229232 */
230- public String getMetadata () {
233+ String getMetadata () {
231234 return metadata ;
232235 }
233236
@@ -246,25 +249,4 @@ public String toString() {
246249
247250 return sb .toString ();
248251 }
249-
250- @ Override
251- public boolean equals (Object o ) {
252- if (this == o ) {
253- return true ;
254- }
255- if (o == null || getClass () != o .getClass ()) {
256- return false ;
257- }
258- SemVer semVer = (SemVer ) o ;
259- return major == semVer .major
260- && minor == semVer .minor
261- && patch == semVer .patch
262- && Objects .equals (preRelease , semVer .preRelease )
263- && Objects .equals (metadata , semVer .metadata );
264- }
265-
266- @ Override
267- public int hashCode () {
268- return Objects .hash (major , minor , patch , preRelease , metadata );
269- }
270252}
0 commit comments