Как удалить статические методы из кода (и как их заменить) - PullRequest
0 голосов
/ 09 января 2019

Я очень новичок в программировании и Java, просто чтобы вы знали ...

Я работаю над скелетом кода / программы (задание в школе), в котором приведено следующее описание, реализующее и тестирующее скелет для программы, управляемой командой, и предназначенной для отслеживания собак у собаки день, и команды, которые программа должна принять на первом этапе, следующие: зарегистрировать новую собаку возраст увеличивается собаки Собака -exit

Единственной из этих команд, которая должна работать правильно, является выход, который должен напечатать сообщение о том, что программа завершена, а затем завершить программу. Это должно быть сделано путем закрытия командной строки, а не System.exit, который не должен использоваться. Другие команды должны печатать только короткий текст, который сообщает, какая команда была указана. Этот текст должен содержать полное имя команды, как указано выше, чтобы тестовая программа могла их идентифицировать. Один из советов - также принимать другие, более короткие команды, чтобы облегчить собственное тестирование. "

Одним из нефункциональных требований является то, что никакие статические методы или переменные не могут использоваться, кроме как в основной строке.

Поэтому мой вопрос; КАК я могу удалить статические методы из моей программы? Мне очень трудно это понять!

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();
    }

}

Ответы [ 6 ]

0 голосов
/ 09 января 2019

Сначала вы слепо удаляете ключевые слова static из всех методов, которые у вас есть (кроме основного), затем это выдаст ошибку времени компиляции, говорящую

Невозможно сделать статическую ссылку на нестатический метод

Это верно, когда вы удалили все ключевое слово static для других методов, оно стало нестатичным, и компилятор Java не позволит вам вызывать их из любого статического блока или метода, если вы не создадите объект и не воспользуетесь его ссылкой для вызова этих методов. .

Затем в вашем основном методе измените код следующим образом

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

Статические методы похожи на бесплатно Вы можете вызывать свободно (без необходимости использования объекта), но для нестатических это не так. Вы можете вызывать нестатический метод из другого нестатического метода без использования ссылки, но вы не можете вызывать нестатический метод из статического блока, если вы не выполните то, что я сказал ранее.

Пример * * тысяча двадцать-один

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
    }
}
0 голосов
/ 09 января 2019

Ваша спецификация не помешала вам создать экземпляр вашего класса, поэтому я не думаю, что вам нужно делать переменные и методы статичными. (кроме вас специально попросили вызвать методы вашего класса без создания экземпляра).

0 голосов
/ 09 января 2019

Прежде всего удалите ключевое слово «static» из ваших методов, а затем в основном создайте экземпляр класса ProgramSkeleton, затем используйте методы этого объекта:

//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 голосов
/ 09 января 2019

Вместо звонка

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

создать новый экземпляр скелета вашей программы ...

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

Это позволит вам удалить ключевое слово static из всех сигнатур других методов, поскольку теперь они связаны с экземпляром класса ProgramSkeleton.

0 голосов
/ 09 января 2019

Ну ... Вам нужен объект для вызова методов, если они не статические .

Сказав это, просто удалите любое ключевое слово static в своем классе, кроме метода main. Затем измените этот основной метод на:

public static void main(String[] args) {
    ProgramSkeleton program = new ProgramSkeleton();
    program.initialize();
    program.runCommandLoop();
    program.closeDown();
}
0 голосов
/ 09 января 2019

Причина, по которой вы вынуждены не использовать static методы в этом задании, состоит в том, чтобы заставить вас использовать более объектно-ориентированный подход.

Как насчет создания Command абстрактного базового класса (или интерфейса, в зависимости от того, что вы уже сделали в своем курсе), а затем создания различных классов для каждой конкретной команды, которую вы имеете, так что RegisterDogCommand, ListDogsCommands, UpdateAgeCommand, RemoveDogCommand, которые распространяются на Command.

Каждый Command может реализовывать метод execute() (может быть абстрактным методом в Command, переопределенным каждым конкретным классом), который делает все, что ему нужно.

В вашей функции main(), где у вас есть switch-case, вы просто создаете правильный объект Command, а затем вызываете execute().

Это также называется шаблоном команды .

Как указано в других ответах, класс с вашим методом main() также может быть создан, а функции, которые у вас есть, могут быть вызваны в экземпляре ProgramSkeleton (таким образом, необязательно, чтобы он был static как таковой). Не уверен, какова была цель вашего назначения (просто удалить static или реализовать команды объектно-ориентированным способом).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...