0

我想编写一个类,以便每次创建一个新对象时,该对象都会生成一个新的代码,但诀窍是我不想将该值作为参数传递给构造函数。大致我有以下几点:

public class Article{
    private int cod;
    private String name;
    public Article(String name){
         this.name=name:
    }
}

然后我有一个名为 invoice 的类,我可以在其中调用这个 Article 类:

public class Invoice{
     ArrayList<Article> detailList;
     public add(Article a){
          detailsList.add(a);
     }
     public ArrayList<Article> getArticleList(){
           return detailList;
     }
}

所以我希望每次我在主类中制作一些文章并将这些文章添加到 Invoie 类中以自动生成代码:

main class

    ArrayList<Article> temp;
    Article a1=new Article(....)
    Article a2=new Article(....) 
    Article a3=new Article(....)
    Invoice inv;
    inv.add(a1)
    inv.add(a2)
    inv.add(a3)
    //for example I want the first element to get a code of 10, the next as 20 and so on
     temp=inv.getArticleList();
        for (int i=0;i<temp.size();i++){
            System.out.println(temp.get(i).getCod());
        }

我试过使用:

private static int cod在文章类

然后每次调用 add 方法时添加 +10,但是当我从主类中的列表中打印结果时,它只打印我最后生成的代码;我该如何解决?

谢谢

4

2 回答 2

3

您需要两个属性,一个static和一个在实例级别:

public class Article {

    private int cod;
    private String name;
    private static int counter = 10;

    public Article(String name) {
        this.name = name;
        this.cod = counter;
        counter += 10;
    }

}

使用上述方法,每篇文章都会有不同的代码,10每次从十个单位开始并递增。我使用这个Invoice类对其进行了测试,它修复了发布代码中的一些错误:

public class Invoice {
    ArrayList<Article> detailList = new ArrayList<Article>();
    public void add(Article a) {
         detailList.add(a);
    }
    public ArrayList<Article> getArticleList(){
          return detailList;
    }
}

现在这可以按预期工作:

Invoice inv = new Invoice();
inv.add(a1);
inv.add(a2);
inv.add(a3);
ArrayList<Article> temp = inv.getArticleList();
for (int i=0;i<temp.size();i++){
    System.out.println(temp.get(i).getCod());
}

它在控制台上打印:

10
20
30
于 2013-11-04T20:34:37.230 回答
1

这是 Oscar 代码的线程安全版本:

import java.util.concurrent.atomic.AtomicInteger;

public class Article {
  private int cod;
  private String name;
  private final static AtomicInteger counter = new AtomicInteger(10);

  public Article(String name) {
    this.name = name;
    this.cod = counter.getAndAdd(10);
  }
}

使用 AtomicInteger 将允许您同时从多个线程创建 Article 实例。使用常规 int 可能会导致计数器的“脏”读取,因此不同的 Article 实例将获得不同的计数器值。

于 2013-11-04T20:44:48.457 回答