12
votes

Les méthodes de magasin Java peuvent-elles stocker des matrices?

Eh bien, j'ai écrit du code et tout ce que je faisais était pour les boucles, mais changer quelle méthode j'ai appelée. J'ai essayé d'utiliser une boucle pour une boucle afin que ce soit un peu plus neutre (et de curiosité pour voir si cela pourrait être fait), mais cela ne compile pas quand je le fais de cette façon, car il ne reconnaît pas un article dans Un tableau comme méthode, je pense. C'est ce que j'ai: xxx

lorsque j'essaie de compiler, je reçois xxx

(il fait référence à la première instruction dans la boucle tandis que "

Alors, je pense que c'est peut-être parce que je fais un tableau de chaîne de type? Y a-t-il une méthode de type? Est-ce possible? Des solutions bienvenues :). De plus, je peux le faire fonctionner avec 4 tandis que des boucles, vous n'avez donc pas besoin de me montrer cette solution. Merci!


0 commentaires

5 Réponses :


6
votes

Vous ne pouvez pas stocker les méthodes dans les tableaux en Java, car les méthodes ne sont pas des objets de première classe en Java. C'est une raison pour laquelle certaines personnes préfèrent utiliser d'autres langues comme Python, schéma, etc.

Le travail autour consiste à créer une interface contenant une méthode, puis créez quatre classes implémentant cette interface - le bouillonnement, le MOVeleft, etc ... les classes. Ensuite, vous pouvez stocker des instances de ces classes dans votre tableau et les appeler de la même manière.


3 commentaires

+1 Oui, les interfaces valent mieux que d'utiliser la réflexion la plupart du temps. :-)


java.lang.reflect.method est un objet de première classe, mais je suis d'accord avec la solution générale que vous avez présentée.


@Brian: Oui, mais c'est un objet représentant la méthode, ce n'est pas une méthode en soi. Vous ne pouvez pas "appeler" une instance de méthode (vous appelez une méthode sur l'instance).



6
votes

Oui, vous pouvez stocker des méthodes dans les tableaux en utilisant reflet , mais est probablement que ce que vous voulez réellement faire dans cette situation est d'utiliser polymorphisme .

Un exemple de polymorphisme par rapport à votre problème - disons que vous avez créé une interface comme suit: p> xxx pré>

Vous pouvez ensuite créer des implémentations comme suit: p> xxx pré>

etc. pour les autres options de déplacement. Vous pouvez ensuite stocker ceux-ci dans un movecommand [] code> ou collection comme une liste code>, puis itérer sur le déplacement de la matrice / collecte () sur chaque élément, pour Exemple: P>

public class Main {

    public static void main(String[] args) {
        List<MoveCommand> commands = new ArrayList<MoveCommand>();
        commands.add(new MoveLeftCommand());
        commands.add(new MoveRightCommand());
        commands.add(new MoveLeftCommand());

        for (MoveCommand command:commands) {
            command.move();
        }
    }

}


0 commentaires

5
votes

Vous ne pouvez pas appeler des méthodes comme ça. Mais vous pouvez utiliser la réflexion:

changez simplement la première ligne dans la boucle tandis que: xxx

(vous devrez déclarer / attraper quelques exceptions près)

Mais vous feriez mieux d'éviter la réflexion et utilisiez le modèle de commande à la place. < / p>


1 commentaires

Pourquoi il vaut mieux éviter la réflexion? Le temps de réflexion prend-il ou la mémoire accablante? Les codes ci-dessus sont très soignés.



17
votes

Vous ne pouvez pas stocker les méthodes directement dans les tableaux. Cependant, vous pouvez stocker des objets, qui implémentent la même méthode différemment. Par exemple: xxx


2 commentaires

Très belle explication. Je vais coller aux quatre boucles pour le moment, mais si c'est encore beaucoup plus que cela, je vais essayer ça!


Une variation est utilisée enums. Vous devez passer l'objet utilisé sur un paramètre dans l'appel de méthode plutôt que sur le constructeur.



1
votes

Réponse mise à jour pour Java 8 et à l'envasement -

Depuis l'introduction de Lambda Expressions et Références de la méthode dans Java 8, stockant diverses méthodes dans des variables est maintenant possible. Un numéro principal est que Les tableaux ne prennent actuellement pas en charge actuellement les objets génériques de Java , ce qui rend la conservation des méthodes dans les matrices moins faisables. Cependant, ils peuvent être stockés dans d'autres structures de données telles que la liste code>. P>

Donc, pour certains exemples simples, vous pouvez écrire quelque chose comme: p>

List<Consumer<String>> consumers = new ArrayList<>();
Consumer<String> consumer1 = System.out::println;
consumers.add(consumer1);


0 commentaires