2010-03-21 46 views
1

我有一個任務來處理複數。每個數字由雙r =實部,雙i =虛部和字符串名組成。名稱必須在構造函數中設置,所以我創建了int計數器,然後我將它的值發送到setNextName函數並返回名稱字母。不幸的是,增加這個'counter'值只能在costructor中運行,然後再次設置爲0.如何處理這個?一些常數值?第二個問題是我還需要提供setNextNames(char c)函數來改變計數器的當前值。會記住它的值的計數器

代碼:

public class Imaginary { 

private double re; 
private double im; 
private String real; 
private String imaginary; 
private String name; 
private int counter=0; 

public Imaginary(double r, double u){ 
    re = r; 
    im = u; 
    name = this.setNextName(counter); 
    counter++; 
} 

public static String setNextName(int c){ 

    String nameTab[] = {"A","B","C","D","E","F","G","H","I","J","K","L","M","N", 
         "O","P","Q","R","S","T","U","W","V","X","Y","Z"}; 

    String setName = nameTab[c]; 
    System.out.println("c: "+c); 
    return setName; 
} 

public static String setNextName(char c){ 

// 
//don't know how to deal with this part 
// 
} 

回答

4

很難告訴你在做什麼,但我懷疑這將解決您的眼前的問題:

private static int counter = 0; 
+0

我希望只有蟒蛇...... :)謝謝 – owca 2010-03-21 14:34:14

+4

@owca:你爲什麼要生活在這樣一個有限的宇宙?!無論語言多麼優秀,我都不會只想要一種語言。或冰淇淋的味道。或音樂的風格。或者......或者......或者......-) – 2010-03-21 14:35:59

+1

@TJC:好說:) – codaddict 2010-03-21 14:39:17

2

你應該讓counter靜態的。

您還應該使nameTab爲私有靜態字段,然後在setNextName()中,您可以遍歷它以查找與給定字符對應的名稱,並獲取其索引。 (在普通的ASCII世界中,當然可以簡單地通過從給定字符中減去'A'的數字值來計算索引,但我不太清楚在Java中如何用Unicode處理瘋狂輸入 - 迭代是安全的。)

0

因爲字段counter不是static,所以每個對象都有自己的計數器。

1

在面向對象的語言通常有兩種類型的變量進入一類:這是唯一的每個實例

  • 由該類的所有實例共享類變量

    • 實例變量

    給定一個類,如:

    public class Person 
    { 
        // class variable 
        private static int numberOfEyes; 
    
        // instance variable 
        private String name; 
    
        // other code goes here 
    } 
    

    若y OU是做這樣的事情:

    Person a = new Person("Jane Doe"); 
    Person b = new Person("John Doe"); 
    

    ,然後做一些事情,如:

    a.setName("Jane Foe"); 
    

    的人的名字「一」會改變,但一個人的「B」將保持不變。

    如果有一天早上醒來,決定你想要的3隻眼:

    Person.setNumberOfEyes(3); 
    

    的Person「a」和人「b」和所有其他人的實例在那裏會突然有3隻眼爲好。

    你想在你的計數器聲明中加入「static」。

  • 1

    是你的代碼被多個線程使用,而不是我建議使計數器靜態不會解決你的問題。

    您需要特別注意通過執行線程同步使用lock關鍵字,如下所示。

    private static readonly obj = new Object(); 
    private static int counter =0; 
    
    public Imaginary(double r, double u) 
    { 
        re = r; 
        im = u; 
        lock(obj) 
        { 
         name = this.setNextName(counter); 
         counter++; 
        } 
    } 
    

    這將保證線程安全性也同時增加您的計數器(有另一種方式也提供線程安全的,但是這一次是有最少的代碼)。

    +0

    Java沒有隻讀和鎖定...我想你在你的例子中使用C#。 – TofuBeer 2010-03-21 17:44:34