[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