Avatar billede vis_dk Nybegynder
16. marts 2005 - 19:22 Der er 10 kommentarer og
1 løsning

Metode som argument.

Hej,

Jeg er igang med at lave et program der skal kunne sende nogle request til at database. Jeg har to klasser, UserArchive og DatabaseConnection.

I UserArchive ønsker jeg at udføre forskellige metoder som disse:
private void getUserDataBase()
{
  dbcon.enqueueRequest(); //Hvilke argumenter?
}

public void addUser(User newuser)
{
  dbcon.enqueueRequest();
}

Som jeg vil enqueue i en kø i DatabaseConnection, som så skal hente oplysningerne. Mit problem er så hvordan DataBaseConnection ved hvor requesten kommer fra når den kommer til den i kø'en. Et bud er f.eks.:

dbcon.enqueueRequest(this, DatabaseConnection.GETUSERDATABASE);

Men så skal man til at lave disse final static til hver metode, og noget grimt switch eller lign.

Så en bedre løsning ville være at give den metode der skal udføres med som argument, kan man det?

Andre forslag til hvordan dette kan løses på en smart måde?
Avatar billede arne_v Ekspert
16. marts 2005 - 19:27 #1
public interface Callback {
    public void done(Object o);
}

og

public class UserArchive implements Callback {
    ...
    public void done(Object o) {
      ...
    }
}

og

...
private Callback cb;
...
public void enqueueRequest(Callback cb, ...) {
this.cb = cb;
...
}
...
så kan du:

cb.done(whatever);
Avatar billede arne_v Ekspert
16. marts 2005 - 19:28 #2
Kig evt. lidt på command pattern og observer pattern !
Avatar billede vis_dk Nybegynder
16. marts 2005 - 19:33 #3
Men der har jeg jo stadig kun mulighed for at køre én metode fra hver klasse ik? (altså done() her). Mit problem er at jeg har flere metoder der bliver kaldt fra samme klasse,  og så skal DatabaseConnection kunne vide hvilken metode der er tale om.

Kan pattern / observer dette?  Jeg kigger på sagen.
Avatar billede arne_v Ekspert
16. marts 2005 - 19:35 #4
Hele pointen er netop at hver klasse kun har en metode. Så database klassen er
ikke i tvivl om hvilken metode den skal kalde.

Men UserArchive.done og Foobar.done gør noget vidt forskelligt og er derfor reelt
2 vidt forskellige metoder.
Avatar billede vis_dk Nybegynder
16. marts 2005 - 19:38 #5
Men hvis jeg har flere metoder i samme klasse, som jeg gerne vil enqueue i kø'en?

Altså mit mål er at jeg skal kunne enqueue noget i kø'en, således at når jeg kommer til det i kø'en så ved jeg hvilken klasse og hvilken metode jeg skal kalde (hvor der kan være x antal forskellige metoder i klasserne)
Avatar billede arne_v Ekspert
16. marts 2005 - 19:47 #6
Så tror jeg at 4 forskellige command klasser (4 konkrete plus den abstrakte de
arver fra) er løsningen
Avatar billede vis_dk Nybegynder
16. marts 2005 - 19:49 #7
ok, tak. Det må jeg kigge på.  Der er ingen mulighed for at give metoder som argument? F.eks. ligesom SML ?
Avatar billede arne_v Ekspert
16. marts 2005 - 19:51 #8
Nej.

(forudsat at du ikke vil igang med noget reflection)
Avatar billede vis_dk Nybegynder
16. marts 2005 - 20:04 #9
Det ser faktisk meget godt ud!

Class c = String.class;
Class[] parameterTypes = new Class[] {String.class};
      Method concatMethod;
      Object[] arguments = new Object[] {secondWord};
      try {
        concatMethod = c.getMethod("concat", parameterTypes);
        result = (String) concatMethod.invoke(firstWord, arguments);
      } catch (NoSuchMethodException e) {
          System.out.println(e);
      } catch (IllegalAccessException e) {
          System.out.println(e);
      } catch (InvocationTargetException e) {
          System.out.println(e);
      }

Det forsøger jeg!  Smid et svar
Avatar billede arne_v Ekspert
16. marts 2005 - 20:08 #10
svar
Avatar billede arne_v Ekspert
16. marts 2005 - 20:08 #11
Vær opmærksom på at reflection koster i performance.

Du kan dog muligvis spare lidt ved at cache Method variablerne mellem kald.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester