Правильно выводить id

187
02 января 2022, 01:10

вопрос заключается в следующем, есть два класса, один "Пользователь", а второй "Сообщения", вопрос в том, как реализовать чтобы при добавлении пользователя за ним закреплялся постоянный id(минимум возможный id был бы 1) и при добавлении нового пользователя id увеличивался на 1! Немного трудности с этим, должен ли быть id записан в конструкторе класса "Пользователь" и как это реализовать чтобы он оставался постоянный за одним пользователем? П.С. класс "Сообщения" нужен для того, чтобы за определенным пользователем сохранялись сообщения.

Answer 1

Например, так :

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
class User {
    private static long ID = 1;
    private final long id;
    private final List<Message> messages;
    public User() {
        this.id = ID++;
        this.messages = new ArrayList<>();        
    }
    public long getId() {
        return id;
    }
    public List<Message> getMessages() {
        return messages;
    }
    public User addMessage(String text) {
        messages.add(new Message(text, this));
        return this;
    }
    @Override
    public String toString() {
        return "User{" + "id=" + id + ", messages=" + messages + '}';
    }
    public static void main(String[] args) {
        User user1 = new User()
                .addMessage("Test1")
                .addMessage("Test2");
        User user2 = new User()
                .addMessage("Test3");
        System.out.println(user1);
        System.out.println(user2);
    }
}
class Message{
    private static long ID = 1;
    private final long id;
    private final LocalDateTime dateTime;
    private final String text;
    private final User author;
    public Message(String text, User user) {
        this.id = ID++;
        this.dateTime = LocalDateTime.now();
        this.text = text;
        this.author = user;
    }
    public long getId() {
        return id;
    }
    public LocalDateTime getDateTime() {
        return dateTime;
    }
    public String getText() {
        return text;
    }
    public User getAuthor() {
        return author;
    }
    @Override
    public String toString() {
        return "Message{" + "id=" + id + ", dateTime=" + dateTime + ", text=" + text + '}';
    }
}
Answer 2

Я использовал следующий код для генерации уникального идентификатора (как строкового так и целого):

public final class UUID {
    transient private static Random random=new Random(System.currentTimeMillis());
    transient private static AtomicInteger stringCounter =new AtomicInteger(0);
    transient private static AtomicLong idCounter=new AtomicLong(0);
    public static synchronized String getStringId() {
        StringBuffer sb=new StringBuffer();
        sb.append(System.currentTimeMillis()).append('.').append(random.nextInt(Integer.MAX_VALUE)).append('.').append(stringCounter.addAndGet(1));
        return sb.toString();
    }
    public static long getLongId() {
        return idCounter.addAndGet(1);
    }
}

Обращаю внимание на Thread safety - иногда это важно. В случае генерации целочисленного идентификатора используется Atomic

Вызывать можно откуда угодно. В вашем случае очевидно в конструкторе User/Message

READ ALSO
Нереальный индекс -1

Нереальный индекс -1

В список с клавиатуры пишу стринги, на экран нужно вывести индекс первой стринги которая меньше предыдущей, пример:

164
Получение значения с android context

Получение значения с android context

Всем приветПереписываю некоторые методы с android приложения для реализации их чисто на java

202
Как ограничить JVM по кол-ву CPU в Linux

Как ограничить JVM по кол-ву CPU в Linux

Есть какой-то сервер к примеру с 16 CPUЕсть JVM (OpenJDK 8u), запускаемая на нем

127