Определять какой класс использовать надо извне. Для этого есть всякие
Factory-паттерны. А проверку внутри абстрактного класса надо убрать.
А статические методы желательно избегать, хотя в простых factory их можно использовать.
Список надо параметризировать типом Human, а класс параметризировать как . Или просто использовать везде тип Human, как бы полиформизм для того и придуман.
UPD
public interface Human {
public void jump();
public void say(String text);
}
public abstract class AbstractHuman implements Human {
protected String name;
public AbstractHuman(String name) {
this.name = name;
}
@Override
public void say(String text) {
System.out.println(name + ": " + text);
}
}
public class Man extends AbstractHuman {
public Man(String name) {
super(name);
}
@Override
public void jump() {
System.out.println("Man jump");
}
}
public class Woman extends AbstractHuman {
public Woman(String name) {
super(name);
}
@Override
public void jump() {
System.out.println("Woman jump");
}
}
public interface HumanFactory {
public static Human createHuman(String name, boolean kadyk) {
if (kadyk) {
return new Man(name);
}
return new Woman(name);
}
}
import java.util.LinkedList;
import java.util.List;
public class Main {
static class DBData {
String name;
boolean kadyk;
public DBData(String name, boolean kadyk) {
this.name = name;
this.kadyk = kadyk;
}
}
public static void main(String[] args) {
List<DBData> source = new LinkedList<>();
source.add(new DBData("Ваня", true));
source.add(new DBData("Маша", false));
source.add(new DBData("Катя", true));
source.add(new DBData("Сергей", true));
List<Human> humanList = new LinkedList<>();
for(DBData data : source) {
humanList.add(HumanFactory.createHuman(data.name, data.kadyk));
}
for(Human human : humanList) {
human.say("Hello");
human.jump();
}
}
}