我遇到了一些具有以下结构的Java代码:
public MyParameterizedFunction(String param1, int param2)
{
this(param1, param2, false);
}
public MyParameterizedFunction(String param1, int param2, boolean param3)
{
//use all three parameters here
}
Run Code Online (Sandbox Code Playgroud)
我知道在C++中我可以为参数指定一个默认值.例如:
void MyParameterizedFunction(String param1, int param2, bool param3=false);
Run Code Online (Sandbox Code Playgroud)
Java是否支持这种语法?有没有理由说这两步语法更可取?
我在许多网站上阅读过Optional只能用作返回类型,而不能在方法参数中使用.我很难找到合乎逻辑的原因.例如,我有一个逻辑,它有2个可选参数.因此,我认为像这样编写我的方法签名是有意义的(解决方案1):
public int calculateSomething(Optional<String> p1, Optional<BigDecimal> p2 {
// my logic
}
Run Code Online (Sandbox Code Playgroud)
许多网页指定Optional不应该用作方法参数.考虑到这一点,我可以使用以下方法签名并添加一个清晰的Javadoc注释来指定参数可能为null,希望将来的维护者将读取Javadoc,因此在使用参数之前始终执行空值检查(解决方案2) :
public int calculateSomething(String p1, BigDecimal p2) {
// my logic
}
Run Code Online (Sandbox Code Playgroud)
或者,我可以用四种公共方法替换我的方法以提供更好的界面并使其更明显p1和p2是可选的(解决方案3):
public int calculateSomething() {
calculateSomething(null, null);
}
public int calculateSomething(String p1) {
calculateSomething(p1, null);
}
public int calculateSomething(BigDecimal p2) {
calculateSomething(null, p2);
}
public int calculateSomething(String p1, BigDecimal p2) {
// my logic
}
Run Code Online (Sandbox Code Playgroud)
现在我尝试编写类的代码,为每种方法调用这条逻辑.我首先从另一个返回Optionals的对象中检索两个输入参数然后调用calculateSomething.因此,如果使用解决方案1,则调用代码将如下所示:
Optional<String> p1 = otherObject.getP1();
Optional<BigInteger> p2 = otherObject.getP2();
int result = myObject.calculateSomething(p1, p2);
Run Code Online (Sandbox Code Playgroud)
如果使用解决方案2,则调用代码将如下所示:
Optional<String> …Run Code Online (Sandbox Code Playgroud) 是否可以声明一个允许可变数量参数的方法?
定义中使用的符号是什么,表明该方法应该允许可变数量的参数?
答案: varargs
可能重复:
Java可选参数
我知道在PHP中如果要调用参数较少的函数,则声明函数如下:
function foo(int param1, int param2 = "2");
Run Code Online (Sandbox Code Playgroud)
现在我可以打电话foo(2),param2并将设置为2.
我尝试在Java构造函数中执行此操作,但似乎不可能.有没有办法做到这一点,或者我只需要声明两个构造函数?
谢谢!
Android功能
PHP示例:
function HaHa($a = "Test")
{
print $a;
}
Run Code Online (Sandbox Code Playgroud)
问题是如何在android中做到这一点......
public void someFunction(int ttt = 5)
{
// something
}
Run Code Online (Sandbox Code Playgroud)
上面的解决方案不起作用,我该怎么办?
谢谢!
我有一个抽象类和一个扩展它的类,我在这两个类中都有一个同名的方法.我想在抽象类的另一个方法中调用抽象类中的方法.
Controller.java
public abstract class Controller {
public Result delete(Long id) {
return this.delete(id, true);
}
public Result delete(Long id, boolean useTransaction) {
// do something and return result
}
}
Run Code Online (Sandbox Code Playgroud)
FileGroup.java
public class FileGroup extends Controller {
public Result delete(Long id, boolean central) {
// do something
return super.delete(id);
}
}
Run Code Online (Sandbox Code Playgroud)
super.delete调用Controller.delete但this.delete(id, true)调用delete的FileGroup,而不是调用delete中Controller,这是造成递归无限循环和堆栈溢出.
这是关于编程最佳实践的问题,我不知道如何在标题中表达问题,对不起,我们走了.
我通过这种方式在Manager或Controller中有一个方法:
public boolean myMethod(Param1 param1);
Run Code Online (Sandbox Code Playgroud)
并且,因为应用程序的更改,我必须像这样重新定义它,因为它调用其他需要param2和param3的方法:
public boolean myMethod(Param1 param1, Param2 param2, Param3 param3);
Run Code Online (Sandbox Code Playgroud)
现在我认识到,与3个PARAMS方法"永远"(现在,也许在未来有变化,我需要与非空PARAMS来称呼它)将被用param2=null和param3=null,所以在第一个方法的实现我做:
public boolean myMethod(Param1 param1) {
return this.myMethod(param1, null, null);
}
public boolean myMethod(Param1 param1, Param2 param2, Param3 param3) {
/* Call to other methods that is needed to pass it param2 and param3 */
}
Run Code Online (Sandbox Code Playgroud)
因此,调用Manager的方法和原始方式是:
boolean isTrue = myManager.myMethod(param1);
Run Code Online (Sandbox Code Playgroud)
这是一个选项,另一个选项是从调用中传递null参数:
boolean isTrue = myManager.myMethod(param1, null, null);
Run Code Online (Sandbox Code Playgroud)
在我的经理中只允许使用一种方法:
public boolean myMethod(Param1 param1, Param2 param2, Param3 param3);
Run Code Online (Sandbox Code Playgroud)
所以,真正的问题是:谈论最佳实践的最佳方法是什么?如果在管理器的实现中我重载一个方法并使用null参数调用它是错误的吗?
提前致谢!
问候.
所以我在下面有以下查询:
public Iterable<Dealer> findAll(Dealer dealer) {
QDealer qdealer = QDealer.dealer;
BooleanExpression where = null;
if(dealer.getId() != null && dealer.getId() != 0) {
buildPredicate(qdealer.id.goe(dealer.getId()));
}
OrderSpecifier<String> sortOrder = QDealer.dealer.dealerCode.desc();
Iterable<Dealer> results = dlrRpstry.findAll(where, sortOrder);
return results;
}
Run Code Online (Sandbox Code Playgroud)
上面的查询工作正常.但是,我想首先按dealerType对结果进行排序,然后由dealerCode对结果进行排序,有点像"由dealerType asc,dealerCode desc订购".如何实例化OrderSpecifier,以便结果将按dealerType排序,然后按经销商代码排序.
DealerRepository dlrRpstry扩展了JpaRepository,QueryDslPredicateExecutor
我使用的是spring-data-jpa-1.1.0,spring-data-commons-dist-1.3.2和querydsl-jpa-2.9.0.
如果OrderSpecifier不能配置为多列排序顺序,那么将满足我对"by dealerType asc,dealerCode desc"排序结果的要求的替代解决方案.
任何帮助将不胜感激.提前致谢.
缺口
我想在java中编写一个平均方法,它可以消耗N个项目,返回它们的平均值:
我的想法是:
public static int average(int[] args){
int total = 0;
for(int i=0;i<args.length;i++){
total = total + args[i];
}
return Math.round (total/args.length);
}
//test it
average(1,2,3) // s**hould return 2.
Run Code Online (Sandbox Code Playgroud)
如何更改我的方法以消耗任何数量的参数而不是int [] args所以可以按我想要的方式工作?干杯
我有一个带有3个参数的Java方法,我希望它也有第4个"可选"参数.我知道Java不直接支持可选参数,所以我编写了第4个参数,当我不想传递它时,我通过了null.(然后方法null在使用之前检查.)我知道这有点笨重......但另一种方法是重载方法,这将导致相当多的重复.
哪种是在Java中实现可选方法参数的更好方法:使用可空参数或重载?为什么?
java ×9
arguments ×2
methods ×2
overloading ×2
class ×1
constructor ×1
default ×1
java-8 ×1
null ×1
optional ×1
parameters ×1
querydsl ×1
superclass ×1
variables ×1