/* Primitives.java Purpose: Description: History: 2002/3/25, Henri Chen: Created. 2003/4/17, Tom M. Yeh: Moves primitive relevant utilities from Classes Copyright (C) 2001 Potix Corporation. All Rights Reserved. {{IS_RIGHT This program is distributed under LGPL Version 2.1 in the hope that it will be useful, but WITHOUT ANY WARRANTY. }}IS_RIGHT */ package org.zkoss.lang; import java.util.Map; import java.util.HashMap; /** * Utilities regarding primitive type and its wrapper class. * * @author henrichen */ public class Primitives { /** * Convert Boolean object to primitive boolean. */ public static final boolean toPrimitive(Boolean obj) { return obj.booleanValue(); } /** * Convert primitive boolean to Boolean. */ public static final Boolean toWrapper(boolean obj) { return Boolean.valueOf(obj); } /** * Convert Byte object to primitive byte. */ public static final byte toPrimitive(Byte obj) { return obj.byteValue(); } /** * Convert primitive byte to Byte. */ public static final Byte toWrapper(byte obj) { return new Byte(obj); } /** * Convert Character object to primitive char. */ public static final char toPrimitive(Character obj) { return obj.charValue(); } /** * Convert primitive char to Character. */ public static final Character toWrapper(char obj) { return new Character(obj); } /** * Convert Double object to primitive double. */ public static final double toPrimitive(Double obj) { return obj.doubleValue(); } /** * Convert primitive double to Double. */ public static final Double toWrapper(double obj) { return new Double(obj); } /** * Convert Float object to primitive float. */ public static final float toPrimitive(Float obj) { return obj.floatValue(); } /** * Convert primitive float to Float. */ public static final Float toWrapper(float obj) { return new Float(obj); } /** * Convert Integer object to primitive int. */ public static final int toPrimitive(Integer obj) { return obj.intValue(); } /** * Convert primitive int to Integer. */ public static final Integer toWrapper(int obj) { return new Integer(obj); } /** * Convert Long object to primitive long. */ public static final long toPrimitive(Long obj) { return obj.longValue(); } /** * Convert primitive long to Long. */ public static final Long toWrapper(long obj) { return new Long(obj); } /** * Convert Short object to primitive short. */ public static final short toPrimitive(Short obj) { return obj.shortValue(); } /** * Convert primitive short to Short. */ public static final Short toWrapper(short obj) { return new Short(obj); } /** The information about a primitive. */ private static class PrimInfo { private final Class cls; private final Object defVal; private final char code; private PrimInfo(Class cls, Object defVal, char code) { this.cls = cls; this.defVal = defVal; this.code = code; } } private static final Map<String, PrimInfo> _prims2i = new HashMap<String, PrimInfo>(16); private static final Map<Class, Class> _primc2c = new HashMap<Class, Class>(16); static { _prims2i.put("int", new PrimInfo(int.class, new Integer(0), 'I')); _prims2i.put("boolean", new PrimInfo(boolean.class, Boolean.FALSE, 'Z')); _prims2i.put("short", new PrimInfo(short.class, new Short((short)0), 'S')); _prims2i.put("byte", new PrimInfo(byte.class, new Byte((byte)0), 'B')); _prims2i.put("char", new PrimInfo(char.class, new Character((char)0), 'C')); _prims2i.put("long", new PrimInfo(long.class, new Long(0), 'L')); _prims2i.put("double", new PrimInfo(double.class, new Double(0), 'D')); _prims2i.put("float", new PrimInfo(float.class, new Float(0), 'F')); _prims2i.put("void", new PrimInfo(void.class, null, 'V')); //we can use the same map because key is in diff class _primc2c.put(Integer.class, int.class); _primc2c.put(Boolean.class, boolean.class); _primc2c.put(Short.class, short.class); _primc2c.put(Byte.class, byte.class); _primc2c.put(Character.class, char.class); _primc2c.put(Long.class, long.class); _primc2c.put(Double.class, double.class); _primc2c.put(Float.class, float.class); _primc2c.put(Void.class, void.class); }; /** Returns the notation of a primitive class, * or ((char)0) if it is not a primitive class. * Example, I for int, Z for boolean... */ public static final char getNotation(String className) { final PrimInfo pi = _prims2i.get(className); return pi != null ? pi.code: (char)0; } /** Returns the default value of a primitive class, * or null if it is not a primitive class. * Example, getDefaultValue(int.class) returns Integer(0). */ public static final Object getDefaultValue(Class cls) { final PrimInfo pi = _prims2i.get(cls.getName()); return pi != null ? pi.defVal: null; } /** Converts a primitive from name to the class, * or null if it is not a primitive class. * <p>Example, toClass("int") returns int.class. */ public static final Class toClass(String clsName) { final PrimInfo pi = _prims2i.get(clsName); return pi != null ? pi.cls: null; } /** Returns the primitive class of the giving wrapper class, * or null if it is not a wrapper class. * <p>Example, toPrimitive(Integer.class) returns int.class. */ public static final Class toPrimitive(Class wrapper) { return _primc2c.get(wrapper); } /** Returns the wrapper class of a primitive class, * or null if it is not a primitive class. * <p>Example, toWrapper(int.class) return Integer.class. */ public static final Class toWrapper(Class primitive) { if (!primitive.isPrimitive()) return null; if (primitive.equals(void.class)) return Void.class; return getDefaultValue(primitive).getClass(); } /** Tests whether a class name is a primitive class, e.g., int and void. */ public static final boolean isPrimitive(String clsName) { return _prims2i.containsKey(clsName); } }