lombok或java'var'有用的用例[重复]
Posted
技术标签:
【中文标题】lombok或java\'var\'有用的用例[重复]【英文标题】:Use cases when lombok or java 'var' is useful [duplicate]lombok或java'var'有用的用例[重复] 【发布时间】:2019-12-14 01:21:10 【问题描述】:var
在您浏览代码并调查乍一看并不清楚的代码时并不多见。当开发人员使用非自我描述的方法名称时,您必须花一些时间来了解变量的真实类型。如果你使用 lombok 的 var
,你将与 lombok 紧密耦合,所以我不会在我的代码中经常使用它
在java中使用var
有哪些有用的用例?
【问题讨论】:
当开发人员使用无用的名称时,没有什么能起作用。许多语言的东西主要是为那些命名事物的人提供的。 var 对List<LocalDate>
来说是一股清新的风,在您需要处理的是有序日期序列的上下文中,还有什么变量“日期”?
Java 10 在语言中添加了 var 关键字,因此使用量可能只会增加。它主要只是一种减少必须指定类型的冗长和冗余的方法。也就是说,在阅读代码时它会使事情变得更加不清楚。我怀疑随着它的使用越来越多,最佳实践会围绕它发展。
"如果你使用 lombok 的 var,你将与 lombok 紧密耦合" Lombok 附带 delombok,一个去除所有 Lombok 使用的工具。所以不,您的代码不会与 Lombok 紧密耦合。您可以随时删除它。
在使用new
运算符时最有用。 List<String> foo = new ArrayList<>()
变为 var foo = new ArrayList<String>()
。类型是明确的,但 Java 的经典语法需要我重复一遍。使用var
时,我不必。
【参考方案1】:
支持var
的论据:
var
需要更少的输入。它比Map<Integer, ArrayList<String>>
更短,有时更容易阅读。
如果方法调用的返回类型发生变化,var
需要更少的代码更改。您只需更改方法调用,而不是更改使用它的每个地方。
var
鼓励为变量使用更具描述性的名称。 IE。 var customer = new Customer();
而不是 var c = new Customer();
。
反对var
的论点:
var
掩盖了实际的变量类型。如果初始化程序没有返回明确定义的类型,您可能无法分辨变量的类型。
使用var
是懒惰的。虽然var
肯定比Map<Integer, ArrayList<String>>
更容易输入,但如果变量名命名不当,您必须进行更深入的搜索才能知道它指的是什么。
var
让我们更难知道底层变量的实际类型。
您不能在所有情况下都使用var
。喜欢:
var i=1,j=2;
- var
一次只接受一个变量。
var arr=1,2,3;
- 数组必须显式声明。
var f=a->a+" ";
- 无法确定这个 lambda 函数是什么类型。
var f=String::replace;
- 不能使用方法引用,因为它们本身没有类型。 More info here.
其中大部分取自 this post for when to use var
in .NET C#,其中 var
关键字从一开始就存在,而对于 Java,它仅从版本 10 开始可用。
哦,还有var
的另一大优势:它比code-golfing 更短(创建一个程序/函数以尽可能少的字节完成特定任务/挑战)。 :) 可能是我不介意添加它的主要原因,因为我经常使用 Java(以及 .NET C#、05AB1E 和 Whitespace)编写高尔夫代码。
相关:Java 7 的菱形运算符。 List<String> names = new ArrayList<>();
与 List<String> names = new ArrayList<String>();
.
我个人仍然使用写出的类型而不是var
,除了代码高尔夫。但也许我只需要在更频繁地使用它之前多习惯一点。为了可读性,并且无需挖掘就可以更清晰,更轻松地查看类型,我根本不使用var
。至于 Java 7 的菱形运算符,我只在字段之后直接实例化它时使用它,但在其他地方实例化它时不会使用它(即我会使用List<String> names = new ArrayList<>();
,而不是List<String> names; /* ... some code here ...*/ names = new ArrayList<>();
)。
不过,总的来说,这一切都归结为偏好。
【讨论】:
我同意。我的经验法则是仅将var
与new
结合使用。在任何其他情况下,它都会引入我宁愿避免的歧义。
@Michael 是的,这也是我对 Java 7 的菱形运算符的感受,正如我在底部提到的。我们工作的应用程序目前仍在 Java 8 中,所以我还没有在开发人员的情况下使用var
,但我确实可以看到它被用于变量的一些直接初始化。 It's also mentioned at the bottom of the C# .NET page I linked (section "How I Use var
and Suggest You Do As Well")..以上是关于lombok或java'var'有用的用例[重复]的主要内容,如果未能解决你的问题,请参考以下文章