- Не создавайте новый объект
Random
каждый раз. - Используйте
random.nextInt(n)
. - Определите метод
hashCode
в ExaminationRoom
. - Если ваш метод
compareTo
будет несовместимым с equals()
, может быть или не быть в порядке. - Используйте
LocalDate
вместо GregorianCalendar
. - Возьмите и используйте возвращаемые значения из
String.toLowerCase()
и Character.toUpperCase()
. - Рассматривайте SpotBugs как более новую альтернативу FindBugs.
Подробнее
Random
Создание нового объекта Random
каждый раз, когда вам нужно, дает ваши более бедные псевдослучайные числа с высоким риском повторения чисел. Объявите переменную stati c, содержащую объект Random
вне вашего метода, и инициализируйте его в объявлении (Random
является поточно-ориентированным, так что вы можете безопасно это сделать). Для рисования псевдослучайного числа от 0 до 4 используйте
int n = 5;
return random.nextInt(n);
Это не только более эффективно (как говорит FindBugs), но прежде всего я нахожу его гораздо более читабельным.
hashCode()
@Override
public int hashCode() {
return Objects.hash(getWaitingPatients());
}
compareTo()
Метод equals
, который вы показали нам, кажется, здесь противоречит FindBugs. Хотя это выглядит немного забавно. Считаются ли две комнаты ожидания одинаковыми, если у них одинаковое количество ожидающих пациентов? Пожалуйста, подумайте еще раз. Если в итоге вы решите, что они не равны, но должны быть отсортированы в одном и том же месте без различия, ваш метод compareTo
несовместим с equals()
. Если это так, пожалуйста, вставьте комментарий с указанием этого факта. Если вы хотите, чтобы FindBugs не сообщал об этом как об ошибке в последующих анализах, у вас есть два варианта:
- Вставить аннотацию, указывающую FindBugs игнорировать «ошибку».
- Создать FindBugs игнорировать файл XML, включая этот пункт.
Извините, я не помню подробностей каждого из них, но ваша поисковая система должна быть полезной.
Дон GregorianCalendar
Класс GregorianCalendar
плохо спроектирован и давно устарел. Я предлагаю вам удалить его из своего кода и использовать вместо него LocalDate
из java .time, современный Java API даты и времени.
doctors.add(new Doctor("Hermione", "Granger", LocalDate.of(1988, Month.DECEMBER, 10), Specialty.PSY, room102));
String.toLowerCase()
Это уже рассматривалось в другом ответе. Изменение имени на первую букву в верхнем регистре, а остальное в нижнем регистре не так просто, как кажется.
firstName.toLowerCase();
Character.toUpperCase(firstName.charAt(0));
Первая из этих двух строк не изменяет строку firstName
, потому что строки были разработаны как неизменяемые и toLowerCase()
возвращают новую строку со всеми буквами в нижнем регистре (в соответствии с правилами локали JVM по умолчанию, сбивает с толку). Вторая строка также не изменяет никаких символов, потому что Java является вызовом по значению (ищите его), поэтому ни один метод не может изменить переменную, переданную в качестве аргумента. Вы даже не передаете переменную, а возвращаете значение из другого метода. Также Character.toUpperCase()
возвращает новый символ в нижнем регистре.
Что вам нужно сделать, это получить значения, возвращенные из этих двух вызовов метода, используйте операцию подстроки для удаления первой буквы из строчной версии имени и объединить прописную версию этой буквы с остальной частью строчной буквы. Если это сложно, я уверен, что ваша поисковая система может найти примеры того, где и как это делается.
Немного в стороне: вы можете подумать дважды, прежде чем заставить доктора Джека Макнеила написать Макнейл и доктор Людвиг фон Солсбургский как Фон Саулсбург .
SpotBugs
Это только то, что я слышал, я не проверял себя. Исходный код FindBugs был принят проектом под названием SpotBugs. Говорят, что SpotBugs разрабатывается более активно, чем FindBugs. Так что вы можете рассмотреть вопрос о переключении. Я сам являюсь счастливым пользователем SpotBugs в моей повседневной работе.
Ссылки