【问题标题】:create Unique id in a private method createaccountID() without using the uuid在不使用 uuid 的私有方法 createaccountID() 中创建唯一 ID
【发布时间】:2013-06-06 21:07:16
【问题描述】:

私有 createAccountID() 方法应该在每次创建帐户时创建一个新的唯一 ID,即创建的第一个帐户将具有该 ID “A1000”。每个新账户的账户ID都会增加1,即第二个 将有 ID “A1001”等,并且不应该有任何重复。

我不太确定如何启动此方法,除了我创建了一个名为 counter 的静态变量并将其设置为 0。我认为我必须使用 .equals() 方法或其他方法来确保第一个不是t 等于新的,否则它将打印一个错误消息,如 ("Duplicate")

我也不确定是否选择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;
    }
}

任何帮助表示感谢干杯

【问题讨论】:

  • 这是在执行过程中唯一的还是它们被保存了,所以下次运行时它会从下一个 ID 开始
  • 我相信它应该是独一无二的,但从措辞上很难理解它的真正含义。因为它确实说“A1000”只是一个例子

标签: java unique-id


【解决方案1】:

您可以将“计数器”起始值设置为 1000 并将其连接到“A”字符以在“帐户 ID”中设置。

为确保没有重复项,您可以使用 Set 接口。例如,私有静态字段中的 HashSet 实现。

另一个变体是使用 TreeSet 并使用它的 last() 方法来获取最新的 ID。然后你可以避免使用计数器。例如,您可以存储一个值为 '1000' 的起始计数器,并使用 treeSet.last() 递增它,然后存储结果。

另外,我不确定您为什么需要公共 createAccountID()。这是一些东西,应该封装在你的类中,不应该在外部调用。

也许将您的 accountID 字段更改为 int 并在 getter 方法中连接到“A”是有意义的。

// 或者你只需​​要一个起始值为 '1000' 的静态计数器,然后在构造函数中调用:

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

【讨论】:

  • 我的措辞应该更具体。这是为了家庭作业,所以我想我必须从构造函数内部调用它,而且我还没有了解 treeSet 或 Hashsets。所以我不确定我是否可以使用它们。我会查找这些以供学习。
  • 如果这是作业,请从构造函数中使用 AtomicInteger 或“this.accountID = 'A' + counter++;”设置它并跳到更有趣的事情:)
【解决方案2】:

如果不涉及多个线程,使用静态计数器将确保没有重复。

如果有多个线程,您可以使用AtomicInteger。在这种情况下,请确保首先使用 incrementAndGet(1) 递增 AtomicInteger,然后在创建 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 Cheremukhin 所述。

【讨论】:

  • 我应该更具体一点,这是为了家庭作业,我还没有学会如何使用 AtomicInteger。所以我需要一种方法来解决它,因为我认为我不允许使用它。我也尝试使用“AtomicInteger”。但这是另一个类的抽象吗?还是来自 java 导入?不知道如何访问它。
  • @user2368486:如果您不使用并发(AKA 线程),您可以使用静态 int。它保证所有对象都将具有相同的值。 AtomicInteger 的情况仅在多个线程访问对象时使用。如果您不需要它,请不要立即考虑它,这将是一个不必要的复杂性。是的,它是一个 java 导入,来自 java.util.concurrent.atomic 包。
【解决方案3】:

创建一个静态变量 counter,将它连接到 A 并递增它。保持你的函数私有,你不应该从你的班级之外调用它。

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

 }

【讨论】:

    猜你喜欢
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    • 2013-04-05
    • 1970-01-01
    • 2011-03-14
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    相关资源
    最近更新 更多