2013-06-25 69 views
0

我有一個類cShape來處理圖形圖像。它在構造函數中佔據了起始位置。我想起始位置是隨機的,所以我有以下的代碼構造函數調用是否必須是構造函數中的第一條語句?

cBalloon(Context InContext, int w, int h) { 
    // set up random postion 
    Random randomGenerator = new Random(); 

    int sx=randomGenerator.nextInt(w); 
    int sy=randomGenerator.nextInt(h); 

    super(InContext, sx, sy, 0,0, 50,50, "balloon", 50,50,0); 
} 

我得到一個錯誤說「Constructor class must be first in a constructor」 有沒有辦法做到這一點?

+11

是的。它必須在構造函數 – Raghunandan

+0

中首先調用超級構造函數中生成數字的方法 – TroyAndAbed

回答

0

這裏有許多可行的實用解決方案,但它讓我感到困擾,沒有一個真正適用於這類任務。一個通用的解決方案適用於某些不是真正隨機的數據源,也就是說,重要的是從同一個實例中獲得兩個值。而且,爲了清潔和簡單的線程安全,避免使用靜態變量甚至是臨時變量將會很好。

所以這裏是我的想法:有一個構造函數調用另一個構造函數,將它傳遞給數據源Random()的臨時實例,它將使用它來獲取兩個值。

public class cBalloon { 

    public cBalloon(Context inContext, int w, int h) { 
     this(inContext, new Random(), w, h); 
    } 

    public cBalloon(Context inContext, Random randomGenerator, int w, int h) { 
     super(inContext, 
       randomGenerator.nextInt(w), 
       randomGenerator.nextInt(h), 
       0,0, 50,50, "balloon", 50,50,0); 
    } 
} 
+0

感謝您的示例代碼。似乎會有更乾淨的方式來做到這一點。 –

1

是的,super(..)應該是構造函數中的第一條語句。

你基本上有四個選項:

1)你可以這樣

cBalloon(Context InContext, int randx, int randY int w, int h, Random randomGenerator) { 
     super(InContext, randomGenerator.nextInt(w), randomGenerator.nextInt(h), ...)  
} 

2直接調用構造函數),或者你可以得到隨機變量之前調用構造函數

cBalloon(Context InContext, int randx, int randY int w, int h){ 
     super(InContext, randx, randY, 0, 0, ...); 
} 

3)創建一個靜態方法,每次調用它時都會生成隨機數。這會讓你的構造方法非常乾淨,這很好。

private static int getRandomInteger(final int x) { 
    Random randomGenerator = new Random(); 
    return randomGenerator.nextInt(x); 
} 

cBalloon(Context InContext, int w, int h){ 
     super(InContext, getRandomInteger(w), getRandomInteger(h), 0, 0, ...); 
} 

4)只需在超類中生成隨機數。

這樣就不需要聲明那些整數變量sxsy

希望它有幫助。

+1

randomGenerator在哪裏被聲明和初始化? –

+0

您可以將它傳遞給構造函數。 –

+0

但是這改變了需求。 –

1

你不能這樣稱呼超級。必須首先在cBalloon構造函數中調用超級函數。所以你需要將隨機數直接傳遞給它。 像這樣:

cBalloon(Context InContext, int randx, int randY int w, int h) 
{ 
    super(InContext, randX, randY, 0,0, 50,50, "balloon", 50,50,0); 
} 
2

super(...)必須在構造函數中第一個發言。

但是,有一個解決辦法:創建一個靜態方法

private static int getRandomtInt(int x) { 
    Random randomGenerator = new Random(); 
    return randomGenerator.nextInt(x); 
} 

,並調用它的超級構造函數:

cBalloon(Context InContext, int w, int h) { 
    super(InContext, getRandomInt(w), getRandomInt(h), 0,0, 50,50, "balloon", 50,50,0); 
} 
+0

難道你不能只做超級(InContext,(new Random).nextInt(w)...)嗎?然而,無論是你的解決方案還是這與原來的解決方案都是完全等價的,因爲隨機數現在來自Random的不同實例,而不是相同的 - 因爲這些東西只是僞隨機取決於實現可能很重要。 –

1

超或本應在構造函數中的第一條語句。你可以像下面這樣做

super(InContext, new Random().nextInt(w), new Random().nextInt(h), 
     0, 0, 50, 50, "balloon", 50, 50, 0) 

甚至這個

class cBalloon{ 
Random randomGenerator=new Random(); 
cBalloon(Context InContext, int w, int h) { 
    // set up random postion 


    super(InContext, randomGenerator.nextInt(w), randomGenerator.nextInt(h), 0,0, 50,50, "balloon", 50,50,0); 
} 

希望這有助於。

+0

+1可能對於大多數目的而言幾乎沒問題,但不完全相同,因爲現在正在使用兩個不同的Random實例。所以實際上,這不是問題所考慮的問題類型的一般解決方案,儘管它可能是編寫該特定程序的有用解決方案。 –

+0

看到我編輯過的一個希望有所幫助 – Dulanga

相關問題