Лучший способ создать класс Java, который содержит сгенерированный идентификатор - PullRequest
0 голосов
/ 10 мая 2019

Я пытаюсь разработать API, который включает в себя регистрацию транзакции в системе.Затем система сгенерирует идентификатор транзакции, который однозначно идентифицирует транзакцию.

Я хотел бы определить класс транзакции как неизменяемый, например:

public class Transaction {
    private final double quantity;
    private final BigDecimal price;

    public Order(double quantity, BigDecimal price) {
        this.quantity = quantity;
        this.price = price;
    }

    public double getQuantity() {
        return quantity;
    }

    public BigDecimal getPrice() {
        return price;
    }
}

Клиент вызывает APIдля создания новой транзакции:

public void storeTransaction(Transaction t)

Но если я сделаю это, как я могу сохранить сгенерированный идентификатор транзакции?

1.Опция 1

Я могу добавить изменяемое состояние в класс транзакции:

public class Transaction {
    private final double quantity;
    private final BigDecimal price;
    private String transactionID;

    public Order(double quantity, BigDecimal price) {
        this.quantity = quantity;
        this.price = price;
    }

    public double getQuantity() {
        return quantity;
    }

    public BigDecimal getPrice() {
        return price;
    }

    public String getTransactionID() {
        return transactionID;
    }

    public void setTransactionID(String id) {
        transactionID = id;
    }
}

Но это сделает класс транзакции изменчивым.

Опция2

Я могу продолжать использовать неизменяемую транзакцию и выставлять API следующим образом:

public String storeTransaction(Transaction t)

Таким образом, вместо сохранения идентификатора транзакции в классе транзакции, я мог бы вернуть его внаш пользователь API.Но это также не выглядит идеально для меня, потому что пользователь должен поддерживать отношение ID-> Transaction.

Какова наилучшая практика для разработки сценария такого типа?

Ответы [ 3 ]

1 голос
/ 10 мая 2019

Вы можете создать идентификатор в своем конструкторе:

public class Transaction {
    private final double quantity;
    private final BigDecimal price;
    private String transactionID;

    public Order(double quantity, BigDecimal price) {
        this.transactionID = this.generateID();
        this.quantity = quantity;
        this.price = price;
    }
}

Теперь просто внедрите метод generateID(), чтобы заполнить детали.

1 голос
/ 10 мая 2019

Ваш метод storeTransaction() может вернуть сохраненную транзакцию, которая также содержит идентификатор.

public Transaction storeTransaction(Transaction t) {
    ...
}

И ваш класс Transaction может иметь два конструктора, один с идентификатором транзакции (если он известен) и один без.

Ваш метод storeTransaction() может сохранить транзакцию без идентификатора или если идентификатор был:

  1. выдает исключение, если вы хотите, чтобы ваши транзакции оставались неизменными в вашей базе данных или
  2. обновить существующую транзакцию, если вам не нужна неизменность в базе данных.

Метод storeTransaction() возвращает новый объект Transaction, содержащий все детали сохраненной транзакции (если, конечно, он не выдал исключение).

0 голосов
/ 10 мая 2019

Ну, доработка не делает его неизменным.Изменить конечное поле в Java довольно просто, даже проще, чем доступ к закрытому полю.Поэтому я бы создал изменяемое поле, но его установщик работает только в том случае, если поле в настоящее время пустое.Таким образом, вы можете установить его только один раз (когда он генерируется).Если поле не равно нулю, вы можете бросить IllegalStateException

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...