Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Hallo, ich versuche gerade eine Klasse zu schreiben die der "Services" vom XNA Framework nachempfunden ist. Wem das nichts sagt versuche ich es mal kurz zu erklären. Ich habe ein array vom Typen Object und speichere dort alle möglichen Objekte. Von jeder Klasse allerdings nicht mehr als eine Instanz. Nachher kann ich mir dann ein bestimmtes Objekt wieder aus dem array holen indem ich nur den Objekttypen des Objektes das ich haben will an die getter Methode übergebe. Ich tappe da ziemlich im dunkeln und wollte mir hier mal professionellen Rat holen.
Hier mein erster Ansatz:
Java:
public class Services {
private final int MAX = 10;
private int last;
private Object[] objects;
public Services()
{
last = 0;
objects = new Object[MAX];
}
/**
*
* @param object The Service which should be added.
*/
public void add(Object object)
{
objects[last] = object;
last++;
}
/**
*
* @param object The object type of the requested Service.
* @return The requested Service. Returns null if no Service was found.
*/
public Object get(Object object)
{
for(int index = 0; index < last; index++)
{
if(object.getClass().getName().equals(objects[index].getClass().getName()))
{
return objects[index];
}
}
return null;
}
}
Ein Aufruf der get Methode dachte ich, könnte dann so aussehen:
Java:
private Camera cam;
cam = (Camera) services.get(Camera.class);
Kurze Erklärung. Eine Map hat keys und zu jedem key einen value. Da key und value jeweils einen beliebigen Typ haben dürfen, hat tfa vorgeschlagen für den key die Klasse zu wählen und der value ist dann jeweils das Objekt. Da es jeden key ja nur einmal geben darf und dieser genau einen value hat, bekommst du das, was du willst: genau ein Objekt pro hinterlegter Klasse.
Du machst eine Abbildung (Map, zb: HashMap), die dein Class-Objekt abbildet auf das eigentliche Service-Objekt. So musst du kein Array durchsuchen. T ist ein Typparameter, der den Typ deines Service angibt, also z.B. Camera.
public class A {
@Override
public String toString() { return "A"; }
}
und das Hauptprogramm
Java:
import java.util.HashMap;
public class Test {
public static void main(String[] args) {
HashMap<Class<?>, Object> map = new HashMap<Class<?>, Object>();
map.put(A.class, new A());
map.put(B.class, new B());
map.put(C.class, new C());
map.put(String.class, "Hello world");
map.put(Integer.class, 42);
System.out.println(map.get(A.class));
System.out.println(map.get(B.class));
System.out.println(map.get(C.class));
System.out.println(map.get(String.class));
System.out.println(map.get(Integer.class));
}
}
Vielen Dank erst mal, aber ich glaube so ganz verstanden habe ich es noch nicht. Ich habe den Code mal angepasst (Die Services Klasse soll static sein, hatte ich eben noch nicht).
Wie komme ich jetzt an den Typen des übergebenen Objektes? Also wie übergibt man einen Objekttypen? Habe jetzt als platzhater einfach Objekttyp.class geschrieben. Ich weiß auch nicht was die get methode als paramter erwarten soll.
Java:
public class Services {
static HashMap<Class<?>, Object> map = new HashMap<Class<?>, Object>();
public Services()
{
}
static void add(Object object)
{
map.put(Objekttyp.class, object);
}
static Object get(/**Was muss hier rein?*/)
{
return map.get(Objekttyp.class);
}
}