Consider UUID as simple value type with concise toString output
Closes gh-30661
This commit is contained in:
		
							parent
							
								
									1df5e9f30c
								
							
						
					
					
						commit
						927d27b121
					
				| 
						 | 
				
			
			@ -27,6 +27,7 @@ import java.util.Locale;
 | 
			
		|||
import java.util.Map;
 | 
			
		||||
import java.util.Optional;
 | 
			
		||||
import java.util.StringJoiner;
 | 
			
		||||
import java.util.UUID;
 | 
			
		||||
 | 
			
		||||
import org.springframework.lang.Nullable;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -903,14 +904,15 @@ public abstract class ObjectUtils {
 | 
			
		|||
	 * <li>Potentially {@linkplain StringUtils#truncate(CharSequence) truncated string}
 | 
			
		||||
	 * if {@code obj} is a {@link String} or {@link CharSequence}</li>
 | 
			
		||||
	 * <li>Potentially {@linkplain StringUtils#truncate(CharSequence) truncated string}
 | 
			
		||||
	 * if {@code obj} is a <em>simple type</em> whose {@code toString()} method returns
 | 
			
		||||
	 * a non-null value.</li>
 | 
			
		||||
	 * if {@code obj} is a <em>simple value type</em> whose {@code toString()} method
 | 
			
		||||
	 * returns a non-null value.</li>
 | 
			
		||||
	 * <li>Otherwise, a string representation of the object's type name concatenated
 | 
			
		||||
	 * with {@code @} and a hex string form of the object's identity hash code</li>
 | 
			
		||||
	 * </ul>
 | 
			
		||||
	 * <p>In the context of this method, a <em>simple type</em> is any of the following:
 | 
			
		||||
	 * a primitive wrapper (excluding {@link Void}), an {@link Enum}, a {@link Number},
 | 
			
		||||
	 * a {@link Date}, a {@link Temporal}, a {@link URI}, a {@link URL}, or a {@link Locale}.
 | 
			
		||||
	 * <p>In the context of this method, a <em>simple value type</em> is any of the following:
 | 
			
		||||
	 * a primitive wrapper (excluding {@code Void}), an {@code Enum}, a {@code Number},
 | 
			
		||||
	 * a {@code Date}, a {@code Temporal}, a {@code UUID}, a {@code URI}, a {@code URL},
 | 
			
		||||
	 * or a {@code Locale}.
 | 
			
		||||
	 * @param obj the object to build a string representation for
 | 
			
		||||
	 * @return a concise string representation of the supplied object
 | 
			
		||||
	 * @since 5.3.27
 | 
			
		||||
| 
						 | 
				
			
			@ -938,13 +940,7 @@ public abstract class ObjectUtils {
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Copy of {@link org.springframework.beans.BeanUtils#isSimpleValueType(Class)}.
 | 
			
		||||
	 * <p>Check if the given type represents a "simple" value type: a primitive or
 | 
			
		||||
	 * primitive wrapper, an enum, a String or other CharSequence, a Number, a
 | 
			
		||||
	 * Date, a Temporal, a URI, a URL, a Locale, or a Class.
 | 
			
		||||
	 * <p>{@code Void} and {@code void} are not considered simple value types.
 | 
			
		||||
	 * @param type the type to check
 | 
			
		||||
	 * @return whether the given type represents a "simple" value type
 | 
			
		||||
	 * Derived from {@link org.springframework.beans.BeanUtils#isSimpleValueType}.
 | 
			
		||||
	 */
 | 
			
		||||
	private static boolean isSimpleValueType(Class<?> type) {
 | 
			
		||||
		return (Void.class != type && void.class != type &&
 | 
			
		||||
| 
						 | 
				
			
			@ -954,6 +950,7 @@ public abstract class ObjectUtils {
 | 
			
		|||
				Number.class.isAssignableFrom(type) ||
 | 
			
		||||
				Date.class.isAssignableFrom(type) ||
 | 
			
		||||
				Temporal.class.isAssignableFrom(type) ||
 | 
			
		||||
				UUID.class.isAssignableFrom(type) ||
 | 
			
		||||
				URI.class == type ||
 | 
			
		||||
				URL.class == type ||
 | 
			
		||||
				Locale.class == type ||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -29,6 +29,7 @@ import java.util.HashSet;
 | 
			
		|||
import java.util.List;
 | 
			
		||||
import java.util.Locale;
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
import java.util.UUID;
 | 
			
		||||
 | 
			
		||||
import org.junit.jupiter.api.Nested;
 | 
			
		||||
import org.junit.jupiter.api.Test;
 | 
			
		||||
| 
						 | 
				
			
			@ -800,6 +801,17 @@ class ObjectUtilsTests {
 | 
			
		|||
			.withMessage("Constant [bogus] does not exist in enum type org.springframework.util.ObjectUtilsTests$Tropes");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	private static void assertEqualHashCodes(int expected, Object array) {
 | 
			
		||||
		int actual = ObjectUtils.nullSafeHashCode(array);
 | 
			
		||||
		assertThat(actual).isEqualTo(expected);
 | 
			
		||||
		assertThat(array.hashCode()).isNotEqualTo(actual);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	enum Tropes {FOO, BAR, baz}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	@Nested
 | 
			
		||||
	class NullSafeConciseToStringTests {
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -861,7 +873,13 @@ class ObjectUtilsTests {
 | 
			
		|||
		}
 | 
			
		||||
 | 
			
		||||
		@Test
 | 
			
		||||
		void nullSafeConciseToStringForUri() {
 | 
			
		||||
		void nullSafeConciseToStringForUUID() {
 | 
			
		||||
			UUID id = UUID.randomUUID();
 | 
			
		||||
			assertThat(ObjectUtils.nullSafeConciseToString(id)).isEqualTo(id.toString());
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		@Test
 | 
			
		||||
		void nullSafeConciseToStringForURI() {
 | 
			
		||||
			String uri = "https://www.example.com/?foo=1&bar=2&baz=3";
 | 
			
		||||
			assertThat(ObjectUtils.nullSafeConciseToString(URI.create(uri))).isEqualTo(uri);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -873,7 +891,7 @@ class ObjectUtilsTests {
 | 
			
		|||
		}
 | 
			
		||||
 | 
			
		||||
		@Test
 | 
			
		||||
		void nullSafeConciseToStringForUrl() throws Exception {
 | 
			
		||||
		void nullSafeConciseToStringForURL() throws Exception {
 | 
			
		||||
			String url = "https://www.example.com/?foo=1&bar=2&baz=3";
 | 
			
		||||
			assertThat(ObjectUtils.nullSafeConciseToString(new URL(url))).isEqualTo(url);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -925,17 +943,6 @@ class ObjectUtilsTests {
 | 
			
		|||
		private static String prefix(Class<?> clazz) {
 | 
			
		||||
			return clazz.getTypeName() + "@";
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	private static void assertEqualHashCodes(int expected, Object array) {
 | 
			
		||||
		int actual = ObjectUtils.nullSafeHashCode(array);
 | 
			
		||||
		assertThat(actual).isEqualTo(expected);
 | 
			
		||||
		assertThat(array.hashCode()).isNotEqualTo(actual);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	enum Tropes {FOO, BAR, baz}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue