[Javalist] generics kérdés

Peter Verhas peter at verhas.com
2012. Jún. 8., P, 18:39:05 CEST



>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




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


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