我正在构建一个平铺地图生成器应用程序,我希望用户能够在构建时将地图的子区域设置为特定类型的平铺。 目前这样实现:
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。我想知道另一种选择会涉及什么?
答案 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]
只是我头脑中的一个。