У меня есть класс LogAnalyzer, который просматривает журнал веб-сервера, создает объекты LogEntry и помещает эти объекты в HashMaps для анализа.
Мой класс LogAnalyzer имеет следующие поля:
private int totalVisits;
private int uniqueVisits;
private ArrayList<LogEntry> records;
private HashMap<String, ArrayList<LogEntry>> uniqueIPs; //<address, log entries>
private HashMap<String, ArrayList<LogEntry>> dailyRecords; // <date, log entries>
Мой конструктор выглядит так:
public LogAnalyzer() {
records = new ArrayList<>();
dailyRecords = new HashMap<>();
uniqueIPs = new HashMap<>();
}
И тогда у меня есть этот метод:
public void initializeRecords(String path){
readFile(path); //reads the web log file and fills out the records and dailyRecords fields
getUniqueIPs(); //fills out the uniqueIPs HashMap field.
uniqueVisits = uniqueIPs.size(); //fills out the uniqueVisits field
totalVisits = records.size(); //fills out the totalVisits field
}
Итак, мой вопрос:
Я прочитал (но на самом деле не понимаю), что "плохо" вызывать методы внутри конструктора. Однако кажется, что конструктор здесь не имеет смысла, так как на самом деле initializeRecords выполняет всю значимую работу по «созданию» объекта.
У меня нет опыта в Java или программирования, чтобы понять объяснения, которые я нашел до сих пор. Есть много разговоров о первостепенных вещах, и я думаю, что это то, что мне не ясно. Мне интересно, почему я должен держать свой конструктор и этот метод разделенными, в простых терминах, которые может понять новичок.
** РЕДАКТИРОВАТЬ: ** Вот код для readFile ():
public void readFile(String filename) {
FileResource fr = new FileResource(filename);
for (String line : fr.lines()){
LogEntry le = WebLogParser.parseEntry(line);
String date = le.getAccessTime().toString().substring(4, 10);
if (dailyRecords.keySet().contains(date)){
dailyRecords.get(date).add(le);
}
else{
ArrayList<LogEntry> entries = new ArrayList<>();
entries.add(le);
dailyRecords.put(date, entries);
}
records.add(le);
}