فهرست منبع

ClassInspector obsługa prymitywów jako #box i #unbox

Ranides Atterwim 13 سال پیش
والد
کامیت
11e01e976f

+ 1 - 1
src/main/java/net/ranides/assira/io/IndentWriter.java

@@ -45,8 +45,8 @@ public class IndentWriter extends Writer {
      * Zmniejsza wcięcie tekstu o jeden poziom.
      */
     public void outdent() {
+        assert prefix >= 1;
         prefix -= indentation;
-        assert prefix >= 0;
     }
     
     /**

+ 53 - 5
src/main/java/net/ranides/assira/reflection/ClassInspector.java

@@ -44,12 +44,12 @@ public final class ClassInspector {
      * zamienia na {@code Integer}. W pozostałych przypadkach po prostu zwraca
      * przekazany argument bez żadnych zmian. W szczególności metoda może być
      * bezpiecznie wywoływana na rzecz wrapperów:
-     * <pre>{@code wrapPrimitive(wrapPrimitive(int.class));}</pre>
+     * <pre>{@code box(box(int.class));}</pre>
      * @param clazz
      * @return
      */
     @SuppressWarnings("PMD")
-    public static Class<?> wrapPrimitive(Class<?> clazz) {
+    public static Class<?> box(Class<?> clazz) {
         
         if (byte[].class.equals(clazz)) {
             return Byte[].class;
@@ -92,6 +92,50 @@ public final class ClassInspector {
         }
     }
     
+    @SuppressWarnings("PMD")
+    public static Class<?> unbox(Class<?> clazz) {
+        
+        if (Byte[].class.equals(clazz)) {
+            return byte[].class;
+        } else if (Short[].class.equals(clazz)) {
+            return short[].class;
+        } else if (Integer[].class.equals(clazz)) {
+            return int[].class;
+        } else if (Long[].class.equals(clazz)) {
+            return long[].class;
+        } else if (Character[].class.equals(clazz)) {
+            return char[].class;
+        } else if (Float[].class.equals(clazz)) {
+            return float[].class;
+        } else if (Double[].class.equals(clazz)) {
+            return double[].class;
+        } else if (Boolean[].class.equals(clazz)) {
+            return boolean[].class;
+        } 
+        
+        if (Byte.class.equals(clazz)) {
+            return byte.class;
+        } else if (Short.class.equals(clazz)) {
+            return short.class;
+        } else if (Integer.class.equals(clazz)) {
+            return int.class;
+        } else if (Long.class.equals(clazz)) {
+            return long.class;
+        } else if (Character.class.equals(clazz)) {
+            return char.class;
+        } else if (Float.class.equals(clazz)) {
+            return float.class;
+        } else if (Double.class.equals(clazz)) {
+            return double.class;
+        } else if (Boolean.class.equals(clazz)) {
+            return boolean.class;
+        } else if (Void.class.equals(clazz)) {
+            return void.class;
+        } else {
+            return clazz;
+        }
+    }
+    
     /**
      * Sprawdza, czy podana klasa reprezentuje nieopakowany typ prymitywny (np {@code int}).
      * @param clazz
@@ -226,7 +270,7 @@ public final class ClassInspector {
      */
     public static boolean isInstance(Class<?> ssuper, Object value) {
         assert ssuper != null;
-        return value==null || ssuper.isInstance(value) || wrapPrimitive(ssuper).isInstance(value);
+        return value==null || ssuper.isInstance(value) || box(ssuper).isInstance(value);
     }
     
     /**
@@ -247,6 +291,10 @@ public final class ClassInspector {
         }
         return true;
     }
+    
+    public static Class<?> getClass(Object value) {
+        return (value==null) ? void.class : value.getClass();
+    }
 
     /**
      * Grupowa wersja funkcji {@code Class.getClass}.
@@ -256,13 +304,13 @@ public final class ClassInspector {
      * @return
      */
     @SuppressWarnings("PMD.MethodReturnsInternalArray")
-    public static <T> Class<?>[] getClass(T... values) {
+    public static Class<?>[] getClass(Object[] values) {
         if( values.length == 0) {
             return EMPTY;
         }
         Class<?> types[] = new Class<?>[values.length];
         for(int i=0; i<values.length; i++) {
-            types[i] = (values[i]==null) ? Object.class : values[i].getClass();
+            types[i] = getClass(values[i]);
         }
         return types;
     }

+ 8 - 8
src/main/java/net/ranides/assira/text/LexicalCast.java

@@ -26,12 +26,12 @@ import net.ranides.assira.time.DateQuickFormat;
  */
 public final class LexicalCast {
     
-    private static final TypeFactory typeFactory = TypeFactory.defaultInstance();
-    private static final ObjectMapper mapper;
+    private static final TypeFactory TYPE_FACTORY = TypeFactory.defaultInstance();
+    private static final ObjectMapper MAPPER;
     
     static {
-        mapper = new ObjectMapper();
-        mapper.configure(SerializationFeature.INDENT_OUTPUT, true);
+        MAPPER = new ObjectMapper();
+        MAPPER.configure(SerializationFeature.INDENT_OUTPUT, true);
     }
 
     private LexicalCast() { }
@@ -104,7 +104,7 @@ public final class LexicalCast {
     
     public static String object2json(Object value) throws JsonCastException {
         try {
-            return mapper.writeValueAsString(value);
+            return MAPPER.writeValueAsString(value);
         } catch(IOException cause) {
             throw new JsonCastException(value.getClass(), cause);
         }
@@ -112,7 +112,7 @@ public final class LexicalCast {
     
     public static <T> T json2object(String value, Class<T> clazz) throws JsonCastException {
         try {
-            return mapper.readValue(value, clazz);
+            return MAPPER.readValue(value, clazz);
         } catch(IOException cause) {
             throw new JsonCastException(value.getClass(), cause);
         }
@@ -121,7 +121,7 @@ public final class LexicalCast {
     @SuppressWarnings("unchecked")
     public static <T> T json2object(String value, TypeToken<T> type) throws JsonCastException {
         try {
-            return (T)mapper.readValue(value, typeFactory.constructType( type.getType() ) );
+            return (T)MAPPER.readValue(value, TYPE_FACTORY.constructType( type.getType() ) );
         } catch(IOException cause) {
             throw new JsonCastException(value.getClass(), cause);
         }
@@ -134,7 +134,7 @@ public final class LexicalCast {
     
     @SuppressWarnings("unchecked")
     public static <T> T cast(Object value, TypeToken<T> type) throws JsonCastException {
-        return (T)rawCast(value, type, typeFactory.constructType( type.getType() ).getRawClass());
+        return (T)rawCast(value, type, TYPE_FACTORY.constructType( type.getType() ).getRawClass());
     }
     
     @SuppressWarnings("PMD")