将随机值设置为未分配/可选参数

时间:2015-02-28 21:21:45

标签: java parameters optional-parameters

我正在构建一个平铺地图生成器应用程序,我希望用户能够在构建时将地图的子区域设置为特定类型的平铺。 目前这样实现:

public boolean setArea(int bottomLeftX, int bottomLeftY, int subWidth, int subHeight, TerrainType aAreaType){
    boolean areaOverflow = false;
        System.out.println("Subarea coords...     x,y:"+bottomLeftX+","+bottomLeftY+" width/height:"+subWidth+"/"+subHeight);
        for(int x=bottomLeftX;x<=bottomLeftX+subWidth-1;x++){
            for(int y=bottomLeftY;y<=bottomLeftY+subHeight-1;y++){
                if(x>=0 && y>=0 &&
                   x<this.getWidth() && y<this.getHeight()){
                    this.setTile(x, y, aAreaType);
                }
                else{
                    areaOverflow = true;
                }
            }
        }
        return areaOverflow;
    }
}

(TerrainType是一个包含地形类型信息的枚举,setTile方法将地图数组中的值设置为某种地形类型.his.getWidth / Height()返回地图数组的大小)< / p>

但我希望用户不必决定每个值,并允许随机选择一些值。我最初的想法是允许用户将一些值设置为null,如果一个值作为null传入,让Java随机函数决定该参数的任意值(在地图的大小内),但是你无法将整数设置为null。我想知道另一种选择会涉及什么?

3 个答案:

答案 0 :(得分:1)

您可以将参数定义为Integer而不是int s。那么为它们传递null值就没有问题了。在方法内部,您将能够检查这些参数中的任何参数是否为null,并根据这些检查的结果进行操作。

答案 1 :(得分:0)

由于Java没有默认参数功能,一种方法是以伸缩方式重载方法:

public class RandomArgumentsSample {

    private final Random generator = new Random();

    public void someMethod(int param1, int param2, SomeEnum someEnum) {
        // Do something useful with all the params, which are never null
    }

    public void someMethod(int param1, int param2) {
        // randomValue() static method implemented in SomeEnum
        // returns one value of the enum, randomly
        this.someMethod(param1, param2, SomeEnum.randomValue());
    }

    public void someMethod(int param1, SomeEnum someEnum) {
        int param2 = this.generator.nextInt(); // change to return number within range
        this.someMethod(param1, param2, someEnum);
    }

    // telescoping overloading is not magic
    // here order of arguments is changed
    // so we don't define a method with the same name and 
    // same argument types in the same order
    public void someMethod(SomeEnum someEnum, int param2) {
        int param1 = this.generator.nextInt(); // change to return number within range
        this.someMethod(param1, param2, someEnum);
    }

    public void someMethod(SomeEnum someEnum) {
        int param1 = this.generator.nextInt(); // change to return number within range
        this.someMethod(param1, someEnum);
        // could have also been this.someMethod(someEnum, param2); 
        // with param2 generated randomly
    }

    // here we choose to generate a default value for param2
    // we can't have another someMethod that receives only one int,
    // since it will clash with this one
    public void someMethod(int param1) {
        int param2 = this.generator.nextInt(); // change to return number within range
        this.someMethod(param1, param2);
    }

    // all arguments are random!
    public void someMethod() {
        int param1 = this.generator.nextInt(); // change to return number within range
        this.someMethod(param1);
    }
}

请阅读评论,因为他们有一些解释。

我们的想法是,参数较少的方法使用更多参数调用方法,并为其未接收的参数生成默认(或随机)值。在链的末尾,调用接收所有参数并执行实际任务的方法。

这种方法并不完美,在我的例子中,没有办法让两个someMethod(int),即一个int收到param1而另一个收到一个int param2 } {{1}}。但有时它就足够了,特别是如果你不需要所有可能的参数组合。

答案 2 :(得分:0)

如果因为任何原因而将int更改为Int不是一个选项(因此为NULL),这是另一种选择。

重载您的方法,但仅限于用户必须明确指定的参数,并使用此方法内部的完整参数调用方法。

简化示例:

public int myMethod(int a, int b, int c) {
  return a+b+c;
}

public int myMethod(int a) {
  return myMethod(a, (int)Math.random(),(int)Math.random());
}

至于你询问有关随机化enum的部分,我会给你添加静态方法enum,例如randomize()。如果你问这个方法的具体实现 - 那是另一个故事。

返回ENUM.values()[someRandomIndex]只是我头脑中的一个。