2010-03-25 2 views
1

Est-il possible en Java pour faire quelque chose comme ceci:Référence à Fnc

fnc (void Reference_to_other_func()); Ce que j'essaye est fondamentalement j'ai le nombre d'endroits où j'ai besoin d'afficher ce même texte à l'utilisateur et la seule différence est quelle méthode est appelée après ce texte. Ainsi, par exemple au lieu d'écrire:

System.out.println("Hello"); 
f1(); 
//in some other place 
System.out.println("Hello"); 
f2(); 
//etc 

Je voudrais définir une fonction:

public void f(void Reference_to_other_func()) 
{ 
System.out.println("Hello"); 
Reference_to_other_func();//HERE I'M INVOKING 
} 

puis au lieu de répéter ce code tout je pourrais écrire quelque chose comme ceci:

f(f1); 
//in some other place 
f(f2) 
//etc. 

Merci pour les réponses

+0

Est-ce que f1() et f2() doivent être dans la même classe? –

+0

Pourquoi voulez-vous faire cela? Vous pouvez passer des références à des variables ou des objets ou appeler des méthodes directement.Vous pouvez également essayer d'utiliser un langage fonctionnel où vous pouvez le faire, comme Haskell. –

Répondre

4

Java n'a pas de fonctions de première classe, ce qui rend le plus fonctionnel-progra techniques de mming un peu fastidieuses à mettre en œuvre. Dans ce cas

, vous pouvez faire une interface:

public interface Callback { 
    void doCallback(); 
} 

(Edit: ou vous pouvez utiliser java.util.concurrent.Callable<V>, qui vous permet de spécifier un type de retour)

déclare alors f prendre une instance de cette interface:

public void f(Callback callback) { 
    System.out.println("Hello"); 
    callback.doCallback(); 
} 

et de transmettre une instance de cette interface au function:

f(new Callback() { 
    public void doCallback() { 
     f1(); 
    } 
}); 
f(new Callback() { 
    public void doCallback() { 
     f2(); 
    } 
}); 

Comme vous pouvez le voir, les gains ne deviendront pas apparents à moins que vous le fassiez pas mal.

2

Par réflexion, vous pouvez obtenir l'objet Method actuel, puis le faire.

public void f(Method m) { System.out.println("Hello"); m.invoke(this, null); } 
+0

Oui, mais l'obtention de l'objet Method est la partie longue. –

0

Malheureusement méthodes (à mon humble avis) (fonctions) ne sont pas des objets de première classe en Java, ce qui signifie que vous ne pouvez pas créer des méthodes anonymes ou nommés, sans l'attacher à une classe de première.

Vous pouvez implémenter une classe qui ne font qu'une chose (par exemple, comme appelable ou Runnable ne)

Vous pouvez créer une classe anonyme comme ceci:

Runnable x = new Runnable(){ 

     @Override 
     public void run() { 
      // TODO Auto-generated method stub 

     } 

    }; //<-- notice the semi-colon. 

et vous pouvez définir votre fonction f comme ceci:

public void f(Runnable x) { 
    System.out.println("Hello"); 
    x.run(); 
} 

}

et appelez comme ça.

... 
// call the f-function :-) 
f(new Runnable(){ 
@Override 
public void run() { 
    System.out.println("World!"); 
    } 
}});