Как в Java правильно проверить уникальность объекта перед созданием? Здравствуйте.
Посоветуйте, пожалуйста, как правильно организовать проверку на уникальность объекта перед его созданием.
public class User {
private String name;
private static Set onlineUsers = new HashSet<>();
public User(String name) { this.name = name; onlineUsers.add(name); }
public void logoutUser() { onlineUsers.remove(this.name); }
public String getName() { return name; }
}
У меня есть класс User, я хочу исключить создание пользователей с одинаковым именем, для этого я хочу записать все имена в HashSet и перед созданием нового объекта User я буду проверять существует ли такое имя. Как правильно организовать логику проверки (правильно ли включать её в данный класс):
1. в конструкторе перед созданием нового объекта User? Нормально ли конструктору выбросить Exception?
2. в том месте кода, где я вызываю конструктор нового объекта User, но в таком случае остается возможность создания двух одинаковых объектов (в другом месте кода, где не будет реализована аналогичная проверка).
3. сделать конструктор private и добавить public static метод addNewUser, который будет проверять есть ли пользователь с таким именем, вызывать конструктор и возвращать ссылку на новый объект? Что должен вернуть данный метод, если указанный объект уже существует и следует ли ему выбросить Exception?

21 Авг 2019 в 06:58
241 +1
0
Ответы
1

Можно использовать третий вариант: сделать конструктор приватным и добавить статический метод для создания объекта. В этом случае метод будет проверять наличие пользователя с таким именем в HashSet и, в зависимости от результата, либо создавать нового пользователя, либо выбрасывать исключение.

Пример:

import java.util.HashSet;
import java.util.Set;
public class User {
private String name;
private static Set<String> onlineUsers = new HashSet<>();
private User(String name) {
this.name = name;
}
public static User addNewUser(String name) throws IllegalArgumentException {
if (onlineUsers.contains(name)) {
throw new IllegalArgumentException("User with name " + name + " already exists");
}
User newUser = new User(name);
onlineUsers.add(name);
return newUser;
}
public void logoutUser() {
onlineUsers.remove(this.name);
}
public String getName() {
return name;
}
}

Таким образом, при попытке создания пользователя с уже существующим именем будет выброшено исключение IllegalArgumentException.

20 Апр в 13:10
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 84 727 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир