Конечно, у меня есть некоторые исследования, такие как сканирование пакетов, отражение java, gson и т. Д.
Что я хочу?
Я хочу получить некоторый экземпляр случайным образом, но сохранить этот код детали в подклассе.
Итак, у каждого подкласса должен быть метод с именем вроде SuperClass nextInstance()
.
Если я получаю список подклассов, скажем classes
, по отражению, мне просто нужно вызвать nextInstance для каждого элемента в classes
.
Это просто будет сделано.
Но мне нужно добавить статический метод для каждого подкласса, и имя должно быть nextInstance
, очень глупо !!!
Почему я хочу это сделать.
Есть огромный тестовый проект, который мне нужно запустить.
И у каждого подкласса есть свои параметры (это случайно).
Я хочу скрыть настройки параметров.
Сотруднику не нужно заботиться о параметрах.
Им просто нужно заботиться о своем собственном коде.
Я думаю, что единственный способ реализовать это - расширить метод из суперкласса.
Чем я занимаюсь.
- Создать фабричный класс для каждого из них ( слишком хлопотно ).
- Добавление пути подкласса в список для загрузки их во время выполнения ( Сложно поддерживать ).
- Попробуйте абстрактный статический метод с помощью отражения (невозможно в Java).
- И так далее (может быть, я откажусь)
Пример
Abstract class SuperClass{
// I know it is impossible in java, but just explain what I mean.
public static abstract SuperClass nextInstance();
}
class SubClassA extend SuperClass{
private double params;
public SuperClass(double parmas){
this.params = params;
}
public static SuperClass nextInstance(){
return new SubClassA(r.nextDouble()+4);
}
}
class SubClassB extend SuperClass{
private int params;
public SuperClass(int parmas){
this.params = params;
}
public static SuperClass nextInstance(){
return new SubClassB(r.nextInt(20)+4);
}
}
class Main{
public static void main(String[] args){
List<Class> classes.....// get classes extend from SuperClass by reflection.
List<SuperClass> res = new ArrayList<>();
for(Class c:classes){
res.add(c.nextInstance())
}
// do something on each element in res.
}
}
Обновление
Я думаю, мне нужно проще объяснить, что я хочу сделать.
Если там кто-то использовал slfj LoggerFactory.getLogger(Class c)
, это будет легче понять.
Для меня мне нужно реализовать метод, подобный Factory.getInstance(Class c)
, и код этого метода вызовет c.nextInstance ();
Есть предложения по этому поводу?