[Javalist] generics kérdés

Peter Verhas peter at verhas.com
2012. Jún. 8., P, 22:11:04 CEST


Nem értem, hogy mit akarsz mondani.



--
Verhás Péter
peter at verhas.com
+36(30)9306805
skype: verhas




On 2012.06.08., at 20:09, Gábor Garami wrote:

> public <T extends FactoryManaged> T get(Class<T> klass) throws Error ?
> 
> Garami Gábor
> E-mail: gabor.garami at hron.me
> Tel: +36 20 235 9621
> MSN: hrgy at vipmail.hu
> Skype: hron84
> 
> 
> 
> 2012/6/8 Peter Verhas <peter at verhas.com>
> 
> 
> >On 2012.06.08., at 12:01, Vig, Balázs wrote:
> >Nem értem, miért zárod ki az interfészeket és absztrakt osztályokat. Nekem még nem sikerült ilyenekkel eljárást hívnom --> minden metódus implementálva lesz, mire hozzád eljut.
> 
> Pont fordítva: Csak interface-t szeretnék megengedni.
> 
> Rá akarom szorítani azt aki használja a factory-t, hogy ne konkrét osztály instance-ot kérjen, hanem interface megvalósítást. Hogy az milyen osztályból lesz létrehozva, az a factory dolga.
> 
> Most ez az interface a javaslatok alapján:
> 
> public interface Factory {
> 
> 
>     public <T extends FactoryManaged> void create(Class<T> interf4ce,
>             Class<? extends T> cl4ss);
> 
>     public <T extends FactoryManaged> T get(Class<T> klass);
> 
>     public void clean();
> }
> 
> 
> (a clean csak kipucolja a factory-t, generics szempontból érdektelen).
> 
> Van egy abstract osztály, ami implementálja ezt az interfészt:
> 
> public abstract class AbstractFactory implements Factory {
> 
>     @Override
>     public <T extends FactoryManaged> void create(Class<T> interf4ce,
>             Class<? extends T> klass) {
>         assertInterface(interf4ce);
>         assertImplements(interf4ce, klass);
>         assertPattern(klass);
>         try {
>             Constructor<? extends T> constructor = klass.getDeclaredConstructor();
>             constructor.setAccessible(true);
>             T object = (T) constructor.newInstance();
>             set(interf4ce, object);
>         } catch (Exception e) {
>             throw new BasicInterpreterInternalError("Can not instantiate " + klass);
>         }
>     }
> 
> // runtime ellenőrzések kiszedve
>     protected void assertPattern(Class<? extends FactoryManaged> klass) {
> ...
>     }
> 
>     protected void assertImplements(Class<? extends FactoryManaged> interf4ce,
> ...
>     }
> 
>     protected void assertInterface(Class<? extends FactoryManaged> klass) {
> ...
>     }
> 
>     abstract <T extends FactoryManaged> void set(Class<T> interf4ce,
>             T object);
> 
> }
> 
> és van egy thread local konkrét osztály:
> 
> public class ThreadLocalFactory extends AbstractFactory {
> 
>     private static Map<Class<? extends FactoryManaged>, FactoryManaged> newMap() {
>         return new HashMap<Class<? extends FactoryManaged>, FactoryManaged>();
>     }
> 
>     private static ThreadLocal<Map<Class<? extends FactoryManaged>, FactoryManaged>> analyzerMap = new ThreadLocal<Map<Class<? extends FactoryManaged>, FactoryManaged>>() {
> 
>         @Override
>         protected Map<Class<? extends FactoryManaged>, FactoryManaged> initialValue() {
>             return newMap();
>         }
> 
>     };
> 
>     @Override
>     public void clean() {
>         analyzerMap.set(newMap());
>     }
> 
>     /**
>      * This method is used by the {@see AbstractFactory} to store created
>      * objects.
>      */
>     <T extends FactoryManaged> void set(Class<T> klass, T analyzer) {
>         analyzerMap.get().put(klass, analyzer);
>     }
> 
>     @SuppressWarnings("unchecked")
>     @Override
>     public <T extends FactoryManaged> T get(Class<T> klass) {
>         assertInterface(klass);
>         // TODO how to alter it to avoid this unchecked cast
>         return (T) analyzerMap.get().get(klass);
>     }
> 
> }
> 
> Most már csak az a kérdés, hogy hogyan lenne korrekt, hogy a @SuppressWarnings("unchecked") ne legyen szükséges. Amiket kezel azoknak van interface-ük, és minden ilyen interface extends FactoryManaged. Ami egyébként teljesen üres. Valamint minden osztálynak pontosan egy private vagy protected vagy default láthatóságú, de semmiképpen sem publikus default konstruktora van, és ezt most runtime ellenőrzi, és ha nem stimmel, akkor egy saját X extends Error()-t dob. Köszönöm a többi javaslatot is, amik nem voltak relevánsak a konkrét esetben, mert hasznosak voltak.
> 
> --
> Verhás Péter
> peter at verhas.com
> +36(30)9306805
> skype: verhas
> 
> 
> 
> 
> 
> _______________________________________________
> Javalist mailing list
> Javalist at lists.javaforum.hu
> http://lists.javaforum.hu/mailman/listinfo/javalist
> 
> 
> _______________________________________________
> Javalist mailing list
> Javalist at lists.javaforum.hu
> http://lists.javaforum.hu/mailman/listinfo/javalist

--------- következő rész ---------
Egy csatolt HTML állomány át lett konvertálva...
URL: <http://lists.javaforum.hu/pipermail/javalist/attachments/20120608/a2718f20/attachment.html>


További információk a(z) Javalist levelezőlistáról