Сценарий:
Рассмотрим следующий абстрактный класс MeasurementType
и его подтипы Acceleration
и Density
:
public abstract class MeasurementType {
protected String name;
protected String[] units;
public MeasurementType() {}
public MeasurementType(String name) {
this.name = name;
}
protected void setName(String name) {
this.name = name;
}
protected String getName() {
return name;
}
protected void setUnits(String[] values) {
this.units = values;
}
}
public class Acceleration extends MeasurementType {
private String name;
public Acceleration () {
super();
}
public Acceleration(String name) {
super();
}
}
public class Density extends MeasurementType {
private String name;
public Density() {
super();
}
public Density(String name) {
super();
}
}
Вопрос:
В чем заключается необходимость в подтипах, так как в этих классах нет ничего, что бы их отличать отдельно (по крайней мере, в моих реализациях), чтобы дать им право на существование как свои собственные сущности, но ради Например, можно сказать, что у них были свои собственные массивы, содержащие единицы для каждого отдельного типа, поэтому плотность имела бы килограммы, граммы и т.д., а ускорение имела бы mph, kmph и т.д.
Наконец, у меня есть этот класс запуска, который я быстро составил:
public class run {
public run() {}
public static MeasurementType testType() {
Acceleration a = new Acceleration("meters per second");
return (MeasurementType) a;
}
public static void main(String[] args) {
MeasurementType mt = testType();
System.out.println(mt.getClass().toString());
System.out.println(mt.getClass().getName());
String type = "acceleration";
String[] units = new String[8];
Object mType;
if(type.equals("acceleration")) {
mType = new Acceleration();
} else if(type.equals("density")) {
mType = new Density();
} else {
mType = new Object();
}
System.out.println(mType.getName());
}
}
Вот где я столкнулся с проблемой, о которой я думал. Я использовал строки для определения типа, который я бы создавал, но проблема в том, что по умолчанию в конце условных операторов я создаю экземпляр объекта, потому что иначе компилятор будет жаловаться на то, что переменная mType
не была бы инициализирована. Я не могу создать объект MeasurementType
, поскольку он является абстрактным классом.
Я думаю, что это скорее вопрос дизайна, но есть ли лучший способ определить класс для создания экземпляра? Предположим, что String type = "acceleration"
пришел из ниспадающего или где-то из некоторого пользовательского интерфейса, я просто его закодировал, потому что это не обязательно для вопроса.
Может кто-то пролить свет на эту ошибку дизайна, как я ее вижу.