2013-06-06 2 views
0

Метод private createAccountID() должен создавать новый уникальный идентификатор каждый раз, когда создается учетная запись, то есть первая созданная учетная запись будет иметь идентификатор «A1000». Идентификатор учетной записи увеличится на 1 для каждой новой учетной записи, то есть второй будет иметь идентификатор «A1001» и т. Д., И не должно быть никаких дубликатов.Создайте уникальный идентификатор в частном методе createaccountID() без использования uuid

Я не уверен, как начать этот метод, за исключением того, что я создал статическую переменную с именем counter, которая установлена ​​в 0. Я думаю, что мне нужно использовать метод .equals() или что-то, чтобы убедиться, что первое не равно новый еще будет распечатайте messege ошибки, как («дубликат»)

Я также не уверен, стоит ли идти с public void createAccountID() или public String createAccountID()

Вот код:

public class Account 
{ 
    private Customer customer; 
    private String accountID; 
    private double balance; 
    private static int counter = 0; 
    private static final double OPENING_BALANCE = 0.0; 


    public Account() 
    { 
     setCustomer(new Customer()); 
     setBalance(OPENING_BALANCE); 
     createAccountID(); 
    } 

    public Account(Customer theCustomer, double theBalance) 
    { 
     setCustomer(theCustomer); 
     setBalance(theBalance); 
     createAccountID(); 
    } 

    private void createAccountID()<------------------------------------------------ 
    { 
     accountID = "A"; 
     for(counter = 0; counter >= 0; ++counter){ 
      accountID+=counter;//stuck in loop doesnt work. 
           //just thought id try it 
     } 
    } 

    public void setCustomer(Customer theCustomer) 
    { 
     if(theCustomer == null){ 
      customer = new Customer(); 
     } 
     else{ 
      customer = theCustomer; 
     } 
    } 

    public Customer getCustomer() 
    { 
     return customer; 
    } 

    public void setBalance(double theBalance) 
    { 
     if(theBalance <= OPENING_BALANCE){ 
      System.out.println("Error. No Negative values"); 
     } 
     else{ 
      balance = theBalance; 
     } 

    } 

    public double getBalance() 
    { 
     return balance; 
    } 
} 

Любая помощь приветствуется Приветствие

+0

Это уникальное во время исполнения или они сохраняются, так что в следующий раз при запуске он начинается на следующей ID –

+0

я считаю его должен быть уникальным от исполнения, но из текста его трудно расшифровать действительно то, что это означает, , потому что он сказал, что «A1000» - всего лишь пример – user2368486

ответ

1

Вы можете установить начальное значение «counter» на 1000 и объединить его с символом «A», чтобы установить «accountID».

Чтобы убедиться, что дубликатов нет, вы можете использовать интерфейс Set. Например, реализация HashSet в частном статическом поле.

Другим вариантом является использование TreeSet и использование его метода last() для получения последнего идентификатора. Тогда вы можете избежать использования счетчика. Например, вы можете сохранить стартовый счетчик со значением «1000» и увеличить его с помощью treeSet.last(), а затем сохранить результат.

Кроме того, я не уверен, зачем вам нужен public createAccountID(). Это то, что должно быть инкапсулировано внутри вашего класса и не должно вызываться извне.

Возможно, имеет смысл изменить поле вашего идентификатора пользователя на int и объединить его с «А» в методе геттера.

// Или, может быть, вам просто нужен статический счетчик с начальным значением «1000», а затем позвонить в конструкторе:

this.accountID = 'A' + counter++; 
+0

. Я должен был уточнить свою формулировку.это было для домашней работы, поэтому я думаю, что мне нужно вызвать ее изнутри конструктора, также я еще не узнал о treeSet или Hashsets. поэтому я не уверен, могу ли я их использовать. Я буду смотреть на них, чтобы учиться. – user2368486

+0

спасибо за помощь – user2368486

+0

Если это для домашней работы, установите ее из конструктора с помощью AtomicInteger или «this.accountID =« A + счетчик ++ »; и пропустить более интересные вещи :) –

0

Если не несколько потоков, участвующих, используя статический счетчик обеспечит что нет дубликатов.

В случае нескольких потоков вы можете использовать AtomicInteger. В этом случае убедитесь, что сначала увеличиваем AtomicInteger с incrementAndGet(1) и после создания ID:

private static final AtomicInteger counter = new AtomicInteger(1000); 
private static final String PREFIX = "A"; 

private String accountID; 

private void createID() { 
    final int number = counter.incrementAndGet(1); 
    accountID = PREFIX + number; 
} 

Обратите внимание, что метод createID должен быть частным, как заявил @Michael Черёмухин.

+0

Я должен был быть более конкретным, это было для домашней работы, я не знал, как использовать AtomicInteger. поэтому мне нужен способ работать с ним, потому что я не думаю, что им разрешено использовать его. Также я попробовал использовать «AtomicInteger». но является ли это абстракцией другого класса? или это из импорта java? не знаете, как получить к нему доступ. – user2368486

+0

@ user2368486: Если вы не используете параллелизм (потоки AKA), вы можете использовать статический int. Он гарантирует, что все объекты будут иметь для него одинаковое значение. Случай AtomicInteger предназначен только для использования, когда несколько потоков обращаются к объектам. Не думайте об этом прямо сейчас, если вам это не нужно, это была бы ненужная сложность. И да, это импорт java из пакета java.util.concurrent.atomic. –

0

Создайте счетчик статических переменных, соедините его с A и увеличьте его. Держите свою функцию конфиденциальной, вы не должны называть ее вне вашего класса.

private void createAccountID() 
{ 
     accountID = "A" + counter++; 

}