Руки бы оторвать за три класса в файле!
Это мне еще повезло, что ИДЕЯ их вот так отображает:
Не стоит импортировать с *
, чуть медленнее запускается и со временем запутаешься в зависимостях.
Статическая коллекция, если ее можно сделать не статической, и при этом ничего не сломать -- не нужна.
Можно считать ее как утечку памяти, ведь она постоянно проинициализирована и хранит в себе данные...
Лучше не вызывать лишний раз toString()
-- сбережешься от лишнего NPE, ведь оно само приводится к строке при конкатенации.
В твоем случае получишь ексепшен, в случае без toString()
строку null.
У тебя:
public static String getRecordsAsString() {
String result = "";
for (String record : commonLog)
result += record + "\n";
return result;
}
Было бы быстрее:
public static String getRecordsAsString() {
StringBuilder result = new StringBuilder();
for (String record : commonLog)
result.append(record).append("\n");
return result.toString();
}
При конкатенации строк каждый раз создается инстанс StringBuilder
, в моем коде он создан только один раз.
Правда, компилятор может и соптимизировать подобные вещи, но лучше перестраховаться.
Вместо (float) 10.0
можно написать 10f
. Там еще с другими типами такая штука есть.
Игнорируешь результат delete()
. Он возвращает статус (из доков):
* @return <code>true</code> if and only if the file or directory is
* successfully deleted; <code>false</code> otherwise
Если файл не удалится, дальше все пойдет по пизде и будет глючить, судя по коду.
Строка 106 (№1) Files.write(Paths.get("jphon.config"), Arrays.asList(config), Charset.forName("US-ASCII"), StandardOpenOption.CREATE_NEW);
ИДЕЯ говорит мне, что если у тебя один элемент, то вместо Arrays.asList(obj)
лучше писать Collections.singletonList(obj)
.
Но учти -- этот массив будет иммутабельным.
Строка 106 (№2) Files.write(Paths.get("jphon.config"), Arrays.asList(config), Charset.forName("US-ASCII"), StandardOpenOption.CREATE_NEW);
Чому US-ASCII
? По стандарту JSON должен лежать в одном из: UTF-{8,16,32}.
А интерфейс здесь вообще нужен? Просто я ща поискал по коду, он используется только один раз -- после его объявления.
Если у тебя метод бросает Exception
, то он уже бросает IOException
, так как это сабкласс
И да, просто на будущее: если ты можешь обработать исключение сразу же, то сделай это. Чем выше по стеку вызовов оно проберется, тем сложнее его отладить.
Поле легко можно преобразовать в локальную переменную, больше нигде не используется.
Лучше сабкласнуть Exception
своим классом. Так и семантика лучше, и какие-нибудь данные кроме строки с информацией туда можешь запихнуть.
} catch (IOException|SecurityException e) {
throw new Exception("Ошибка при запуске процесса!");
}
За такое отрывают руки -- ты не залоггировал причину на месте или не пробросил source exception (ексепшн, который ты поймал) вверх по стеку.
Экспресс-фикс: throw new Exception("Ошибка при запуске процесса!", e);
, ну лучше, как я уже говорил, сабкласснуть Exception
.
Думаю, если coreProcess
не равен null, то надо еще проверить isAlive()
.
Ух, ебать! Хуй разберешься, что здесь происходит, как-то все в одном бедном конструкторе навалено.
Разнеси по разным методам, даже если они будут вызываться из одного места. Итак...
Nested try. Здесь тот самый случай, когда ексепшн лучше пробросить наверх, а то совсем каша.
Не понял, что здесь происходит -- ты считываешь ЖСОН по строчке? У него же структура есть... Хотя если это работает, то я упоролся.
Использование результат присвоения немного странно, начинаешь подозревать, что там должно было быть ==
.
На будущее -- строки в switch сравнивать небезопасно из-за коллизии хешей, здесь они слабенькие.
break;
в последнем выражении свитча, конечно, не обязателен, но лучше поставить -- а вдруг ты после этого еще один кейс допишешь?
Охуеешь отлаживать.
Строка 95 CommonLog.addRecord("! Json нихера не парсится. Что-то не так пошло. Проблемная строка:");
Ты залоггировал JSON, что не распарсился, но не записал сам ексепшен, а там тоже есть полезные сведения.
Тут сразу в начале файла четыре поля, которые можно преобразовать в локальные переменные, но не суть.
Именно в этом файле могу ошибаться, так как со свингом не работал.
trayMenuShow.addActionListener((ActionEvent e) -> {
toggleVisibility(aboutFrame);
});
можно заменить на
trayMenuShow.addActionListener((ActionEvent e) -> toggleVisibility(aboutFrame));
if (getState() == Frame.NORMAL) {
setState(Frame.ICONIFIED);
} else {
setState(Frame.NORMAL);
}
можно полностью заменить на тернарный оператор setState(getState() == Frame.NORMAL ? Frame.ICONIFIED : Frame.NORMAL);
, но я их не люблю.
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
coreHandler.stopProcess();
}));
можно заменить на Runtime.getRuntime().addShutdownHook(new Thread(() -> coreHandler.stopProcess()));
, но еще лучше заменить на Runtime.getRuntime().addShutdownHook(new Thread(coreHandler::stopProcess));
.
CoreParser coreParser;
coreParser = new CoreParser(is);
Поскольку эта переменная присваивается, но не считывается, компилятор имеет полное право это выражения удалить, емнип. Оно здесь нужно?