我遇到了一些具有以下结构的Java代码:
public MyParameterizedFunction(String param1, int param2)
{
this(param1, param2, false);
}
public MyParameterizedFunction(String param1, int param2, boolean param3)
{
//use all three parameters here
}
我知道,在C++中,我可以为参数指定默认值。例如:
void MyParameterizedFunction(String param1, int param2, bool param3=false);
Java是否支持这种语法?这两步语法是可取的,有什么原因吗?
您可以使用Java方法调用生成器自动生成具有默认值的生成器。
只需将@GenerateMethodInvocationBuilder添加到类或接口,并将@Default添加到需要默认值的方法中的参数。编译时将使用您在注释中指定的默认值生成生成器。
@GenerateMethodInvocationBuilder
public class CarService {
public CarService() {
}
public String getCarsByFilter(//
@Default("Color.BLUE") Color color, //
@Default("new ProductionYear(2001)") ProductionYear productionYear,//
@Default("Tomas") String owner//
) {
return "Filtering... " + color + productionYear + owner;
}
}
然后可以调用这些方法。
CarService instance = new CarService();
String carsByFilter = CarServiceGetCarsByFilterBuilder.getCarsByFilter()//
.invoke(instance);
或者将任何默认值设置为其他值。
CarService instance = new CarService();
String carsByFilter = CarServiceGetCarsByFilterBuilder.getCarsByFilter()//
.withColor(Color.YELLOW)//
.invoke(instance);
不,但你可以很容易地模仿它们。C++中的内容是:
public: void myFunction(int a, int b=5, string c="test") { ... }
在Java中,它将是一个重载函数:
public void myFunction(int a, int b, string c) { ... }
public void myFunction(int a, int b) {
myFunction(a, b, "test");
}
public void myFunction(int a) {
myFunction(a, 5);
}
前面提到过,默认参数导致函数重载中出现不明确的情况。这根本不是真的,我们可以在C++的例子中看到:是的,也许它会产生模棱两可的情况,但这些问题可以很容易地处理。它根本不是用Java开发的,可能是因为创建者想要一种像C++那样简单得多的语言——如果他们有权利的话,这是另一个问题。但我们大多数人并不认为他使用Java,因为它很简单。
直接的答案是否定的。
这些答案相当陈旧,主要讨论了即使java没有直接的默认方法参数,我们也可以选择哪些选项。
我们可以用java中的函数式编程轻松地处理这个场景。
我们可以使用java函数式编程的方法currying,我认为它可以最好地用于需要使用默认参数的场景。
在以下情况下,我们可能需要一个默认参数。。。例子:创建一个对两个不同对象有效的方法,并返回计算结果
int mutiply(int a,int b){
return a*b;
}
如果我们想有一个乘2的方法,我们必须重写如下方法
int mutiply(int a){
mutiply(a, 2); // as can not write mutiply(int a,b=2)
}
上面,2是b的默认值,但它是固定的。如果我们想乘以3,现在我们不能再重载了,而且有多个这样的方法确实很奇怪。
这是我们可以使用方法currying技术的时候。
Currying方法是将多参数函数转换为多个函数的方法,每个函数都接受一个参数。
创建Curried方法的步骤
编写一个接受单个参数并返回另一个参数的函数函数,如下所示。函数<Integer,函数<Integer>>multiply=a->{返回b->a*b;};让我们简化并理解上述方法。
Above方法只接受一个整数Argument,并返回另一个函数,其中一个参数a作为默认值,b作为变量。如果您感到困惑,并开始思考该方法如何使用调用者函数中的变量,而不知道闭包…
“闭包是指在其词汇上下文中引用自由变量的函数。”在这里,在本例中,闭包是对变量multiply进行操作时返回的函数,它有一个自由变量a,它具有调用函数的词法上下文。
返回乘法方法或修复其中一个参数的默认值。//乘法在第一步中定义multiplyByTwo=多重应用(2)multiplyByThree=multiply.apply(3);multiplyByFour=多重应用(4);;等等…将第二个变量传递给返回的函数以获得结果。multiplyByTwo.apply(2)//后果multiplyByTwo.apply(3)//结果6multiplyByThree.应用(2)//结果6multiplyByThree.应用(3)//结果9multiplyByFour.应用(2)//结果8multiplyByFour.应用(3)//结果124
你可以在这里找到我的原始帖子。。。https://www.linkedin.com/pulse/can-we-have-default-method-parameter-java-rajat-singh/?trackingId=yW84I1fzT6WGStrNPAWn4w%3D%3D
我就是这样做的。。。这可能不如对定义的参数使用“可选参数”方便,但它可以完成任务:
public void postUserMessage(String s,boolean wipeClean)
{
if(wipeClean)
{
userInformation.setText(s + "\n");
}
else
{
postUserMessage(s);
}
}
public void postUserMessage(String s)
{
userInformation.appendText(s + "\n");
}
注意,我可以只使用字符串调用同一个方法名,也可以使用字符串和布尔值调用它。在这种情况下,将wipeClean设置为true将用提供的字符串替换TextArea中的所有文本。将wipeClean设置为false或将其全部忽略,只需将提供的文本附加到TextArea。
另外请注意,我并没有重复这两个方法中的代码,我只是添加了一个功能,即通过创建一个同名的新方法(仅使用添加的布尔值)来重置TextArea。
实际上,我认为这比Java为我们的参数提供“可选参数”要简单一些,因为我们需要为默认值等进行编码。在本例中,我不需要担心这些问题。是的,我在课堂上增加了另一种方法,但从长远来看,我个人认为这更容易阅读。