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”有没有办法做到这一点?

4

5 回答 5

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);
}
于 2013-06-25T17:54:21.427 回答
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)只需在超类中生成随机数。

没有必要像那样声明那些整数sx变量sy

希望能帮助到你。

于 2013-06-25T17:53:36.740 回答
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);
}
于 2013-06-25T17:54:00.583 回答
1

super 或 this 应该是构造函数中的第一条语句。你可以这样做

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);
}

希望这可以帮助。

于 2013-06-25T17:58:54.237 回答
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);
    }
}
于 2013-06-25T18:52:33.297 回答