2
votes

Comment supprimer des méthodes statiques d'un code (et comment les remplacer)

Je suis très nouveau dans la programmation et Java juste pour que vous sachiez ...

Je travaille sur un squelette de code / programme (affectation à l'école) qui a la description suivante implémenter et tester un squelette pour une commande - programme contrôlé et il est destiné à être utilisé pour suivre les chiens lors d'une journée canine, et les commandes que le programme doit accepter à la première étape sont les suivantes: -enregistrer un nouveau chien -augmenter l'âge -liste des chiens -enlever le chien -exit

La seule de ces commandes qui devrait fonctionner correctement est exit qui devrait afficher un message indiquant que le programme est terminé, puis le programme. Cela doit être fait en fermant la ligne de commande, et non par System.exit, qui ne doit pas être utilisé. Les autres commandes ne devraient imprimer qu'un court texte indiquant quelle commande a été spécifiée. Ce texte doit contenir le nom complet de la commande comme ci-dessus afin que le programme de test puisse les identifier. Une astuce est d'accepter également d'autres commandes plus courtes afin que vos propres tests deviennent plus faciles. "

Une des exigences non fonctionnelles est qu'aucune méthode ou variable statique ne peut être utilisée sauf sur la chaîne principale.

Ma question est donc: COMMENT puis-je supprimer les méthodes statiques de mon squelette de programme? J'ai vraiment du mal à comprendre cela!

import java.util.Scanner;

public class ProgramSkeleton {

    static Scanner input = new Scanner(System.in);

    public static void initialize() {
        System.out.println("Welcome to the dog register!");
        System.out.println("Write 0 to register new dog");
        System.out.println("Write 1 to increase age");
        System.out.println("Write 2 to list dogs");
        System.out.println("Write 3 to remove dog");
        System.out.println("Write 4 to exit");
    }

    public static void runCommandLoop() {
        boolean done;
        do {
            String command = readCommand();
            done = handleCommand(command);
        } while (!done);
    }

    public static String readCommand() {
        System.out.print("> ");
        String command = input.nextLine();
        return command;
    }

    private static boolean handleCommand(String command) {
        switch (command) {
        case "0":
        case "register new dog":
            System.out.println("You have chosen register new dog.");
            return true;
        case "1":
        case "increase age":
            System.out.println("You have chosen increase age.");
            return true;
        case "2":
        case "list dogs":
            System.out.println("You have chosen list dogs.");
            return true;
        case "3":
        case "remove dog":
            System.out.println("You have chosen remove dog.");
            return true;
        case "4":
            break;
        default:
            System.out.println("unknown command");
            return false;
        }
        return false;
    }

    public static void closeDown() {
        System.out.println("Goodbye!");
    }

    public static void main(String[] args) {
        initialize();
        runCommandLoop();
        closeDown();
    }

}


0 commentaires

6 Réponses :


2
votes

La raison pour laquelle vous êtes obligé de ne pas utiliser de méthodes statiques dans cette tâche est de vous forcer à utiliser une approche plus orientée objet.

Qu'en est-il de la création d'une classe de base abstraite Command (ou d'une interface, en fonction de ce que vous avez fait jusqu'à présent dans votre cours), puis de la création de classes différentes pour chaque commande spécifique que vous avez, donc RegisterDogCommand , ListDogsCommands , UpdateAgeCommand , RemoveDogCommand , qui tous étendent Command .

Chaque Command pourrait implémenter une méthode execute () (pourrait être une méthode abstraite dans Command puis remplacée par chaque classe concrète) tout ce qu'il doit faire.

Dans votre fonction main () , où vous avez votre switch-case , vous créez simplement le bon objet Command , puis appelez < code> exécuter () .

Ceci est également connu sous le nom de modèle de commande .

Comme indiqué dans d'autres réponses, la classe avec votre méthode main () pourrait également être instanciée et les fonctions que vous avez pourraient alors être appelées sur l'instance de ProgramSkeleton ( donc pas besoin d'être statique en soi). Je ne sais pas quel était l'objectif de votre mission (s'il fallait simplement supprimer static ou implémenter les commandes de manière orientée objet).


0 commentaires

0
votes

Eh bien ... Vous avez besoin d'un objet pour appeler des méthodes dessus, si elles ne sont pas statiques .

Cela dit, supprimez simplement tout static mot-clé dans votre classe, sauf pour la méthode principale. Puis changez cette méthode principale en:

public static void main(String[] args) {
    ProgramSkeleton program = new ProgramSkeleton();
    program.initialize();
    program.runCommandLoop();
    program.closeDown();
}


0 commentaires

3
votes

Au lieu d'appeler

    ProgramSkeleton skeleton = new ProgramSkeleton();
    skeleton.initialize();
    skeleton.runCommandLoop();
    skeleton.closeDown();

, créez une nouvelle instance du squelette de votre programme ...

    initialize();
    runCommandLoop();
    closeDown();

Cela vous permettra de supprimer les éléments statiques mot-clé de toutes les autres signatures de méthode, car ils sont désormais associés à une instance de la classe ProgramSkeleton.


0 commentaires

0
votes

Tout d'abord, supprimez le mot-clé "static" de vos méthodes, puis dans vous créez une instance de la classe ProgramSkeleton, puis utilisez les méthodes de cet objet:

//remove static
public void initialize() {
    System.out.println("Welcome to the dog register!");

    System.out.println("Write 0 to register new dog");
    System.out.println("Write 1 to increase age");
    System.out.println("Write 2 to list dogs");
    System.out.println("Write 3 to remove dog");
    System.out.println("Write 4 to exit");
}
...

//Create object in main
...
ProgramSkeleton programSkeleton = new ProgramSkeleton();
programSkeleton.initialize()


0 commentaires

-1
votes

Votre spécification ne vous a pas empêché de créer une instance de votre classe, donc je ne pense pas que vous ayez besoin de rendre les variables et les méthodes statiques. (sauf que l'on vous a spécifiquement demandé d'appeler les méthodes de votre classe sans créer d'instance).


0 commentaires

0
votes

Tout d'abord, vous supprimez aveuglément les mots-clés static de toutes les méthodes que vous avez (sauf la méthode principale), puis cela donnera une erreur de compilation en disant

Impossible de faire une référence statique à la méthode non statique

C'est correct, lorsque vous avez supprimé tous les mots-clés statiques pour d'autres méthodes, il est devenu non statique et le compilateur Java ne vous permettra pas de les appeler à partir d'un bloc ou d'une méthode statique, sauf si vous créez un objet et utilisez sa référence pour appeler ces méthodes.

Ensuite, dans votre méthode principale, changez le code comme ceci

public class RemoveStatic {

    static void test1() {
        test3();    //  error because we need to create an object and call test3() on its reference
    }

    void test2() {
        test3();    //  perfectly fine - We can call a non-static method inside another non-static method
    }

    void test3() {

    }

    public static void main(String[] args) {
        //  How to call a non-static method inside a static method
        RemoveStatic removeStatic = new RemoveStatic();
        //  removeStatic is the reference to the object
        removeStatic.test3();

        test1();    //  static methods dosen't need a refernce to be called
    }
}

Les méthodes statiques sont comme gratuitement strong > vous pouvez appeler librement (pas besoin d'un objet), mais pour les non-statiques ce n'est pas le cas. Vous pouvez appeler une méthode non statique à partir d'une autre méthode non statique sans utiliser de référence, mais vous ne pouvez pas appeler une méthode non statique à partir d'un bloc statique à moins que vous ne fassiez ce que j'ai déjà dit.

Exemple

ProgramSkeleton programSkeleton = new ProgramSkeleton();
programSkeleton.initialize();
programSkeleton.runCommandLoop();
programSkeleton.closeDown();


0 commentaires