我想编写一个类,以便每次创建一个新对象时,该对象都有一个新生成的代码,但诀窍是我不想将该值作为参数传递给构造函数。我大概有以下几点:
public class Article{
private int cod;
private String name;
public Article(String name){
this.name=name:
}
}
然后我有一个名为invoice的类,我可以在其中调用此Article class:
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,但是当我从主类的列表中打印结果时,它只会打印出最后生成的代码;我该如何解决?
感谢
答案 0 :(得分: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
开始,每次增加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
答案 1 :(得分: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实例将获得不同的计数器值。