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<>();)。 不过,总的来说,这一切都归结为偏好。

【讨论】:

我同意。我的经验法则是仅将varnew 结合使用。在任何其他情况下,它都会引入我宁愿避免的歧义。 @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'有用的用例[重复]的主要内容,如果未能解决你的问题,请参考以下文章

实现类似的用例看起来像代码重复

如何从 Lombok builder 中排除财产?

包含演示者或返回数据的用例?

pytest-28-重复执行用例(pytest-repeat)

在 C++ 中显式删除移动构造函数的用例 [关闭]

python+appium自动化测试-重复执行测试用例