Avatar billede jakobverner Nybegynder
19. november 2006 - 17:34 Der er 9 kommentarer og
1 løsning

Array af metoder??

Jeg har hørt men kan putte metoder i et array, men jeg ved ikke hvordan man implementere det?

Jeg tænker mig at jeg har metode1, metode2 og metode3

Så kan jeg oprette...
metodeArray[] = {metode1, metode2, metode3};

Således at metode2 bliver kaldt når...
metodeArray[1];

eller metode3 bliver kaldt når...
metodeArray[2];

Hvordan implementere man det???
Avatar billede arne_v Ekspert
19. november 2006 - 17:45 #1
det kan du ikke

men du kan lave et array af et interface som har en bestemt metode, hvilket i en del
tilfælde vil kunne opnå samme funktionalitet
Avatar billede jakobverner Nybegynder
19. november 2006 - 17:48 #2
og ud fra mit eksempel, hvordan ville det så se ud?
Avatar billede winners79 Nybegynder
19. november 2006 - 17:52 #3
Hvis du nu har en person klasse:

Method[] metoder = new Method[20];
int i=0;
for (Method m : Person.class.getMethods()) {
metoder[i] = m;
i++;}
Avatar billede arne_v Ekspert
19. november 2006 - 18:10 #4
public class ArrayOfMethods {
    public static void main(String[] args) {
        MethodContainer[] m = new MethodContainer[] { new A(), new B() };
        m[0].doSomething();
        m[1].doSomething();
    }
}

interface MethodContainer {
    public void doSomething();
}

class A implements MethodContainer {
    public void doSomething() {
        System.out.println("I am an A");
    }
}

class B implements MethodContainer {
    public void doSomething() {
        System.out.println("I am a B");
    }
}
Avatar billede jakobverner Nybegynder
19. november 2006 - 18:18 #5
0k, jeg prøver med arne_v's forslag.... tak for hjælpen, kast et svar!
Avatar billede arne_v Ekspert
19. november 2006 - 18:24 #6
gerne

winners79's forslag kan dog også bruges som en generel løsning, men invoke syntaxen
der skal bruges for at kalde er nok lidt tung
Avatar billede arne_v Ekspert
19. november 2006 - 18:48 #7
hvis den skulle operationaliseres tror jeg at den skulle laves som Map:

import java.lang.reflect.*;
import java.util.*;

public class ArrayOfMethodsReflection {
    public static void main(String[] args)throws Exception  {
        Map<String, Method> m = new HashMap<String, Method>();
        for (Method met : ArrayOfMethodsReflection.class.getMethods()) {
            m.put(met.getName(), met);
        }
        m.get("a").invoke(null, new Object[] { });
        m.get("b").invoke(null, new Object[] { });
    }
    public static void a() {
        System.out.println("I am a");
    }
    public static void b() {
        System.out.println("I am b");
    }

}
Avatar billede winners79 Nybegynder
19. november 2006 - 18:58 #8
bare et spørgsmål, hvis man kender positionen i arrayet har den ikke den samme asymptotiske kompleksitet som et opslag i HashMap, altså O(1) ?
Avatar billede arne_v Ekspert
19. november 2006 - 21:41 #9
jo - det var ikke et effektivitets spørgsmpl men et læsbarheds spørgsmål

import java.lang.reflect.*;
import java.util.*;

public class ArrayOfMethodsReflection2 {
    public static void main(String[] args)throws Exception  {
        List<Method> lst = new ArrayList<Method>();
        for (Method met : ArrayOfMethodsReflection2.class.getMethods()) {
            lst.add(met);
        }
        lst.get(2).invoke(null, new Object[] { });
        lst.get(1).invoke(null, new Object[] { });
    }
    public static void a() {
        System.out.println("I am a");
    }
    public static void b() {
        System.out.println("I am b");
    }
}

is not obious that it will call a first and b last
Avatar billede winners79 Nybegynder
19. november 2006 - 22:51 #10
ahh ja så giver jeg dig helt ret :)

og jeg ved faktisk heller ikke om for each iteratoren er lineær
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