2013-11-04 79 views
0

我想編寫一個類,以便每次創建新對象時,該對象都有一個新生成的代碼,但技巧是我不想將該值作爲對構造函數的一個參數。大約我具備以下條件:自動生成類中的變量值

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

然後我有一個名爲發票類中,我可以把這個文章類:

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在文章類

然後每次我加入+10時加入+10,但是當我從主類的列表中打印結果時,它只打印我最後生成的代碼;我該如何解決這個問題?

感謝

+0

你應該閱讀什麼是靜態變量。你幾乎可以像現在這樣使用它,但應該將靜態變量從同步塊中分配給實例變量,或者使用AtomicInteger。 –

+0

該代碼不計算,不清楚你想在哪裏添加代碼或將其減去。 – 2013-11-04 20:37:41

回答

3

您需要2個屬性,一個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 
+0

除非您處於多線程環境中,否則使用這種靜態計數器將無法確保生成的「cod」在實例中是唯一的。 –

+0

thansk @oscar,但是當我從列表中打印結果時,它不會正確顯示結果;它只得到兩個代碼,第三個得到重複 – Little

+0

@Giodude OP只是學習如何編程,你的關注是有效的(我認爲你的意思是「單線程」環境),但把它放在透視中:多線程問題是OP目前最擔心的問題。 –

1

這是一個線程安全版本的奧斯卡代碼:

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將允許您同時從多個線程創建文章的實例。使用常規的int可能會導致計數器的「髒」讀取,因此不同的文章實例會得到不同的計數器值。