Re: Type of a generic class?
02.08.2012 22:04, Donkey Hottie kirjoitti:
I have this class called Global. It is trying to be a simplistic
simulation of global as in MUMPS/M language. It is a persistent
variable, that is accessible everywhere, and retains it's value over
time. I store them in a database.
Actually I renamed this to a SystemProperty, and will implement the
Global<T extends java.io.Serializable> later. It will act just like
MUMPS Global and does not need any clutterin oddities. Any serializable
objects just serialized to a BLOB.
I have a separate use case for that too.
public class Global<T extends java.io.Serializable>
{
private static final Log LOG = LogFactoryUtil.getLog(Global.class);
final String name;
final Connection conn;
public Global(String name, Connection conn)
{
this.name = name;
this.conn = conn;
}
public T get() throws Exception
{
T rc = null;
LOG.info(String.format("Returning Global value %s=%s ",
this.name, String.valueOf(rc)));
throw new Exception("Not yet implemented!");
}
public void set(T value) throws Exception
{
LOG.info(String.format("Setting Global value %s=%s ",
this.name, String.valueOf(value)));
throw new Exception("Not yet implemented!");
}
}
First problem I have is to translate the type to a lower level
application API call. I can not leave the cast or type conversion to
compiler only.
For that I figured out that I may need a variable of Class<T>, I'm using
the variables isAssignableFrom(Class) to find out the correct API call.
Could there be a simpler way?
the final Class<T> as a member variable. Is that really needed? How
could I use some typeinfo (reflection API?) instead?
If I could use serialization and store the objects that way maybe into
BLOBs there would not be problems, but currently I can not do that.
I would like to get rid of that "klass" argument for the Global<T>. Any
ideas?
Class is a simple version containg only the important parts.
public class Global<T extends Object>
{
final String name ;
final Connection conn ;
final Class<T> klass;
public Global(String name, Connection conn, Class<T> klass)
{
this.name = name ;
this.conn = conn ;
this.klass = klass;
}
@SuppressWarnings("unchecked")
public T get() throws Exception
{
T rc = null;
if (klass.isAssignableFrom(Boolean.class))
{
rc = (T)SystemProperties.getSystemBoolean(name, conn);
}
else if(klass.isAssignableFrom(Date.class))
{
rc = (T)SystemProperties.getSystemDate(name, conn);
}
else if (klass.isAssignableFrom(Long.class))
{
rc = (T)SystemProperties.getSystemLong(name, conn);
}
else if (klass.isAssignableFrom(Integer.class))
{
rc = (T)SystemProperties.getSystemInt(name, conn);
}
else if (klass.isAssignableFrom(String.class))
{
rc = (T)SystemProperties.getSystemString(name, conn);
}
return rc ;
}
}