Привет, мой вопрос такой. Предположим, у вас есть интерфейс, который определяет, как будет реализован конвертер. Этот интерфейс может иметь метод loadDocument () и другой convert (). Теперь предположим, что мы хотим иметь несколько конвертеров, ConvertHTML2DOC, ConvertXML2HTML e.t.c, у вас есть идея.
Предположим, вы получаете два формата, которые вам нужно конвертировать, в 2 строки (не имеет значения, КАК вы их получили). Теперь вам нужно создать экземпляр вашего конвертера и конвертировать документы.
Мой вопрос: что лучше: на самом деле создать сложный оператор if или загрузить классы посредством отражения с помощью класса Class? чтобы продемонстрировать, я написал небольшой пример того, что я имею в виду. В моем примере у меня есть 2 класса P1 и P2, которые совместно используют интерфейс. Я также создаю 50000 из них, чтобы показать разницу в скорости. Как оказалось, нормальный вызов немного быстрее, но я думаю, что в сложном примере, таком как тот, который я упоминал в начале, преимущества создания классов с помощью метода Class более удобны и более удобны в обслуживании. Что ты думаешь?
import java.util.*;
public class Test {
public static void main(String[] args) {
try {
Random r = new Random();
Date test1start = new Date();
for (int i = 0; i<= 50000; i++){
Printable p = (Printable)Class.forName("P"+(r.nextInt(2)+1)).newInstance();
System.out.println(p.getString());
}
Date test1stop = new Date();
Date test2start = new Date();
for (int i = 0; i<= 50000; i++){
Printable p;
if (r.nextInt(2) == 0 ) {
p = new P1();
} else {
p = new P2();
}
System.out.println(p.getString());
}
Date test2stop = new Date();
System.out.println("Test with 'Class' invocation took "+(test1stop.getTime()-test1start.getTime())+" milliseconds.");
System.out.println("Test with 'normal' invocation took "+(test2stop.getTime()-test2start.getTime())+" milliseconds.");
} catch (Exception e) {
}
}
}
interface Printable {
public String getString();
}
class P1 implements Printable {
public String getString(){
return "1";
}
}
class P2 implements Printable {
public String getString(){
return "2";
}
}