Как в 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?
Можно использовать третий вариант: сделать конструктор приватным и добавить статический метод для создания объекта. В этом случае метод будет проверять наличие пользователя с таким именем в 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.
Можно использовать третий вариант: сделать конструктор приватным и добавить статический метод для создания объекта. В этом случае метод будет проверять наличие пользователя с таким именем в 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.