У меня есть класс Orders, и мне нужно иметь шаблон singleton, чтобы иметь возможность создавать порядковый номер для каждого обработанного заказа. Как это реализовать?
Мой класс заказа имеет Order_ID, Customer_ID, Order_desc и Ordered_qty. Необходимо создать порядковый номер для каждого заказа, обработанного с использованием шаблона singleton.
Это может быть одна из тех проблем X/Y, где вы думаете, что Y - это решение для X, поэтому вы обращаетесь за помощью к Y, но, возможно, есть лучшее решение.
Строго говоря, для реализации singleton вам нужен только класс, чьи только конструкторы являются частными, статическая ссылка на экземпляр класса как поля класса и общедоступный метод getInstance. Затем создайте метод экземпляра, который возвращает следующий номер в строке.
public class MySingleton {
private static MySingleton instance = new MySingleton();
private volatile int next = 0;
private MySingleton() {
// prevent external instantiation of a singleton.
}
public static MySingleton getInstance() {
return instance;
}
public synchronized int getNextSequence() {
return next++;
}
}
Есть много недостатков с этим решением вашей проблемы, некоторые из них - просто базовый дизайн ООП, а некоторые более системные:
getInstance
должен быть статическим.
Ключевым аспектом является использование одного AtomicLong в качестве одноэлементного. Вы можете моделировать его следующим образом:
class Orders {
private static final AtomicLong NEXT_ID = new AtomicLong();
static Order newOrder(Customer customer, String description, int quantity) {
return new Order(orderId(), customer, description, quantity);
}
private static long orderId() {
return NEXT_ID.incrementAndGet();
}
}
class Order {
private final long orderId;
private final long customerId;
private final String description;
private final int quantity;
Order(long orderId, Customer customer, String description, int quantity) {
this.orderId = orderId;
this.quantity = quantity;
this.customerId = customer.getCustomerId();
this.description = description;
}
}
class Customer {
public long getCustomerId() {
throw new UnsupportedOperationException("not yet implemented");
}
}
Хотя я согласен с @Elliott Frisch, что сам вопрос звучит странно. Однако, если вам действительно нужно генерировать идентификаторы самостоятельно, вот прототип, который реализует классическую версию шаблона Singleton.
public class IdGenerator {
private static IdGenerator instance;
private int id = 0;
private IdGenerator(){}
private static IdGenerator getInstance() {
synchronized(IdGenerator.class) {
if (instance == null) {
instance = new IdGenerator();
}
return instance;
}
}
public int nextId() {
return id++;
}
}
Обратите внимание, что слово "классический". Существует много возможных улучшений шаблона Singleton, и есть сотни статей, которые объясняют их.