Получение имени класса в унаследованном статическом методе в Java - PullRequest
0 голосов
/ 21 сентября 2018

Скажем, я хочу решить кучу проблем Project Euler в Java и вместо того, чтобы дать каждому классу проблемы шаблон своего собственного main метода, унаследовать его и вместо этого использовать метод «решить».

Есть ли способ заставить имя класса задачи распечатать вместе с решением?

Что у меня есть:

abstract class Problem {

    private static String problemName = ???

    public static void main(String[] args) {
//  If I could summon an instance of the sub-class then it would be easy
//        Problem p = new ... what?
        System.out.println(problemName + ": " + solve());
    }

    abstract static long solve();
// oops, you can't do abstract static in Java :(
}

затем

public class Euler_001 extends Problem {
    static long solve() {...}
}

Проблемазаключается в том, что различные хаки для получения имени класса, указанного в этом ответе , возвращают «Проблему», а не «Euler_001».

Я думаю, мне нужно создать экземпляр класса проблемы, но как это сделатьЯ так делаю?

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Статический контекст не помогает наследованию, когда родитель должен вызвать ребенка.Используйте экземпляры с абстракцией:

abstract class Problem {

    public static void main(String[] args) throws Exception {

        Problem problem;

        //Now, depending on where the exact problem is specified:

        //Class known at compile time
        problem = new Euler_001();

        //Class passed as parameter
        problem = (Problem) Class.forName(args[0]).getConstructor().newInstance();

        System.out.println(problem.getProblemName() + ": " + problem.solve());
    }

    abstract long solve();
    abstract String getProblemName();
}

И подкласс обеспечит нормальную реализацию, которая переопределяет абстрактные методы:

class Euler_001 extends Problem {
    @Override
    long solve() {
         return 0;
     }

    @Override
    String getProblemName() {
        return "????";
    }
}

В зависимости от вашего подхода к конфигурации, вы можете создать экземпляр конкретногокласс, основанный на имени класса, внутри main метода родителя.

Таким образом, класс Problem можно вызвать с помощью:

java com.mypackage.Problem "com.mypackage.Euler_001"
0 голосов
/ 21 сентября 2018

Статические переменные и методы не могут быть переопределены - они заменяются.Итак, насколько я понимаю, нам нужно создать экземпляр подкласса.
Я проверил -
Проблема p = new Euler_001 ();
System.out.println (p.getClass (). GetSimpleName ());// печатает Euler_001

...