[Javalist] generics kérdés

Gábor Garami gabor.garami at hron.me
2012. Jún. 8., P, 20:09:36 CEST


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<? extendsFactoryManaged>, 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
>
>
--------- következő rész ---------
Egy csatolt HTML állomány át lett konvertálva...
URL: <http://lists.javaforum.hu/pipermail/javalist/attachments/20120608/847bf592/attachment.html>


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