[java] CustomEventSupport

Pagina: 1
Acties:

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024
Ik heb me al een tijdje zitten ergeren aan de afhandeling van eigen events. Iedere keer heb je in je class een of meerdere vectoren met eventlisteners. Daarom heb ik een nieuwe class gemaakt: CustomEventSupport. Hierin kan per EventListeners een Vector met listeners geplaatst worden. Ik hoor graag jullie commentaar hier over.

ps: Serializable support komt nog en javadoc mist ook nog.

CustomEventSupport


vb:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
interface BanaanListener extends EventListener{
    public void banaanBeschikbaar(BanaanEvent banaanEvent);
}

interface PeerListener extends EventListener{
    public void peerBeschikbaar(PeerEvent peerEvent);
}

interface FruitMandListener extends EventListener{
    public void nietLeeg(FruitMandEvent fruitMandEvent);
    public void leeg(FruitMandEvent fruitMandEvent);
}

class FruitMand{
    CustomEventSupport _customEventSupport = new CustomEventSupport();

    public FruitMand(){
        _customEventSupport.createSupport(BanaanListener.class);
        _customEventSupport.createSupport(PeerListener.class);
        _customEventSupport.createSupport(FruitMandListener.class);
    }

    public void addEventListener(Class eventListenerInterface, EventListener eventListener){
        _customEventSupport.addEventListener(eventListenerInterface,eventListener);
    }

    public void removeEventListener(Class eventListenerInterface, EventListener eventListener){
        _customEventSupport.removeEventListener(eventListenerInterface,eventListener);
    }

    public void haalEtenOp(){

        BanaanEvent banaanEvent = new BanaanEvent(banaan);
        EventListener[] blisteners = _customEventSupport.getEventListener(BanaanListener.class);
        for(int k=0;k<blisteners.length;k++){
            BanaanListener banaanListener = (BanaanListener)blisteners[k];
            banaanListener.banaanBeschikbaar(banaanEvent);
        }
        
        PeerEvent peerEvent = new PeerEvent(peer);
        EventListener[] plisteners = _customEventSupport.getEventListener(PeerListener.class);
        for(int k=0;k<plisteners.length;k++){
            PeerListener peerListener = (PeerListener)plisteners[k];
            peerListener.peerBeschikbaar(peerEvent);
        }
        
        FruitMandEvent fruitMandEvent = new FruitMandEvent(fruitMand);
        EventListener[] flisteners = _customEventSupport.getEventListener(FruitMandListener.class);
        for(int k=0;k<flisteners.length;k++){
            FruitMandListener fruitMandListener = (FruitMandListener)flisteners[k];
            fruitMandListener.nietLeeg(fruitMandEvent);
        }                   
    }
    
    public void gooiAllesWeg(){
        FruitMandEvent fruitMandEvent = new FruitMandEvent(fruitMand);
        EventListener[] flisteners = _customEventSupport.getEventListener(FruitMandListener.class);
        for(int k=0;k<flisteners.length;k++){
            FruitMandListener fruitMandListener = (FruitMandListener)flisteners[k];
            fruitMandListener.leeg(fruitMandEvent);
        }       
    }
}

  • yrew
  • Registratie: Augustus 2001
  • Laatst online: 15:57
ik ga hem thuis ff bekijken......dit is echt nog iets wat ik niet helemaal goed doorheb erg interessant.

Groetjes


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024
misschien vind je deze ook wel handig:
http://forum.javahova.net/topic.php?id=490

is EventSupport voor collections, erugh handig.

  • yrew
  • Registratie: Augustus 2001
  • Laatst online: 15:57
voel me bijna schuldig dat ik je geen zinnig commentaar kan geven, maar laat me dit even thuis bekijken. Kzit nu op werk in een klote omgeving, totaal niet te concentreren hier.

2 andere tweakers : Help die gast eens, hij reageert altijd als eerste en nu geen enkele reactie damn.......

Groetjes


  • Xanthus
  • Registratie: Februari 2002
  • Laatst online: 11-07 12:45
Sweet!
* Xanthus geeft ode aan alarmnummer
Alleen lijkt het alsof java programmeurs vaker dingen maken voor andere java programmeurs dan voor bedrijven ;)

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024
Op woensdag 10 april 2002 17:45 schreef Xanthus het volgende:
Sweet!
* Xanthus geeft ode aan alarmnummer
Alleen lijkt het alsof java programmeurs vaker dingen maken voor andere java programmeurs dan voor bedrijven ;)
Ik heb het voor mezelf gemaakt omdat ik flauw ben van onnodige complexiteit. Ik schiet er dus iets mee op en hoop dat jullie er ook iets aan hebben. Hier is trouwens de source: CustomEventSupport

en die van collectionSupport:
CollectionSupport
CollectionEvent
CollectionListener

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 09-09 22:48

.oisyn

Moderator Devschuur®

Demotivational Speaker

crossposter ;)

iets wat ik ook wilde posten op javahova vanmorgen (maar ik had geen tijd), waarom laat je je CostumEventSupport de events niet afvuren? Hmmmja nou ik er over nadenk, misschien wordt dat te omslachtig... (omdat je moet aangeven welke methode enzo).
Is er trouwens een manier om van een methode in een keer de signature op te vragen (net als bij Klasse.class zeg maar), of moet je perse met strings en parameter lists gaan werken?

En nog iets anders, waarom gebruik je geen Iteration of Enumeration ipv een array op te vragen? Niet dat mij het wat uitmaakt, maar ik ben benieuwd naar de beweegredenen hierachter :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024
Op woensdag 10 april 2002 18:13 schreef OiSyN het volgende:
crossposter ;)

iets wat ik ook wilde posten op javahova vanmorgen (maar ik had geen tijd), waarom laat je je CostumEventSupport de events niet afvuren? Hmmmja nou ik er over nadenk, misschien wordt dat te omslachtig... (omdat je moet aangeven welke methode enzo).
precies :) Ik heb er even mee lopen pielen, maar ik vond het (nog) niet de moeite waarde. Alhoewel dit wel mogelijk zou zijn:

fire(BanaanListener.class.getMethod("banaanBeschikbaar",BanaanEvent.class),banaan);

(niet op syntax letten :)

misschien dat ik het er nog even inzet.. :)
Is er trouwens een manier om van een methode in een keer de signature op te vragen (net als bij Klasse.class zeg maar), of moet je perse met strings en parameter lists gaan werken?
Je kan het Methode object hiervoor gebruiken.
En nog iets anders, waarom gebruik je geen Iteration of Enumeration ipv een array op te vragen? Niet dat mij het wat uitmaakt, maar ik ben benieuwd naar de beweegredenen hierachter :)
Je leverd een copie af van de listerers zodat het support weer ontvankelijk is voor nieuwe events. En een copy gaat het snelst met een array :) Een vector heeft in zich een array en een linked list bv die kost nog meer tijd om op te bouwen. Die array kan gemaakt worden mbv System.arrayCopy en das lekker snel :P Dus vandaar de array :)

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024
Volgens mij zou dit wel moeten werken.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public void fire(Method method, Object[] args) {
   if (method == null) {
    throw new NullPointerException("method can`t be null");
   }

   if (args == null) {
    throw new NullPointerException("args can`t be null");
   }

   EventListener[] listeners = getEventListeners(method.getDeclaringClass());

   try {
    for (int k = 0; k < listeners.length; k++) {
       method.invoke(listeners[k], args);
    }
   } catch (IllegalAccessException e) {
    throw new RuntimeException(e);
   } catch (InvocationTargetException e) {
    throw new RuntimeException(e);
   }
}

hier werkt, maar dit is vb aanroepende code:
code:
1
2
3
4
5
6
7
8
try {
   _customEventSupport.fire(
    SolutionListener.class.getMethod("solutionNotAvailable",new Class[]{SolutionEvent.class}),
    new Object[]{new SolutionEvent(this)}
   );
} catch (NoSuchMethodException e) {
   throw new RuntimeException(e);
}

Of je hier nu blij van moet worden :)

  • tomato
  • Registratie: November 1999
  • Niet online
Alarmnummer:
code:
1
2
3
4
5
6
7
8
9
10
public void fire(Method method, Object[] args) {
   if (method == null) {
throw new NullPointerException("method can`t be null");
   }

   if (args == null) {
throw new NullPointerException("args can`t be null");
   }
/*
*/
Assertions >:)

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024
[b]Op woensdag 10 april 2002 19:07 schreef tomato het
Assertions >:)
Lees de documentatie maar, je mag assertions niet gebruiken voor publieke methodes :)

  • tomato
  • Registratie: November 1999
  • Niet online
Alarmnummer: Lees de documentatie maar, je mag assertions niet gebruiken voor publieke methodes :)
Yep, you're right (en niet alleen uit documentatie te halen, maar ook uit gezond verstand) ;)

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024
Op woensdag 10 april 2002 19:13 schreef tomato het volgende:

[..]

Yep, you're right (en niet alleen uit documentatie te halen, maar ook uit gezond verstand) ;)
precies, het kon wel eens zijn dat client toch iets foutdoet, en als je assertions ook nog eens uit heb staan (zoals een client gebruiker bij een api kan instellen) dan heb je de rapen gaar :)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 09-09 22:48

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op woensdag 10 april 2002 18:24 schreef Alarmnummer het volgende:

Je kan het Methode object hiervoor gebruiken.
Ja maar dan moet je dus met strings en parameter lists gaan pielen, zoals ik al zei (en zoals je al aangaf in dat stukje (lelijke) code wat erna kwam :)). Hoewel je die Method wel van te voren kunt opvragen en opslaan natuurlijk.

Nee, ik dacht misschien is er iets van, als je normaal instantie.methode () zou aanroepen, dat je de Method kon krijgen door Klasse.methode.method te doen of iets dergelijks.
Je leverd een copie af van de listerers zodat het support weer ontvankelijk is voor nieuwe events.
ah ok, nu ik er over nadenk is het wel logisch dat je wilt dat je de lijst zo snel mogelijk kunt veranderen, zonder dat die Enum daardoor de fout in gaat (bijvoorbeeld dat je in de event handler een van de listeners weghaalt die nog aangeroepen moet worden, zodat die dus nooit meer aangeroepen wordt) :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1