我应该在Java 10中使用var吗?

27

考虑到我不能在非可指定类型(Nulls、匿名类、一些单方法类和最重要的交叉类型)中使用 var,那么为了更好的可读性和一致性,我最好不使用它(尤其是因为它只用于局部类型)?

我有点觉得会被滥用:

var a = someObj.getSomeValue().getSomethingElse().returnsSomething();

4
可以用于非表示类型。 - Jorn Vernee
7
就我个人而言,我也不喜欢它,所以我的答案是你不应该使用它。在我看来,您应该始终知道类型,不写类型可能会影响可读性,这可以说是不好的。除此之外,Java 语言层面上还有很多更加有用的东西可以添加。尽管如此,在这些事情上我是一个老派的人,肯定会有其他人持不同的意见,因此这只是基于观点的问题,并且与本主题无关。 - Michael Berry
9
本文介绍了本地变量类型推断的样式指南,包括适当的命名惯例、代码格式和注释约定。它旨在帮助Java程序员使用LVTI功能编写易于维护和理解的代码。 - Stuart Marks
11
在许多情况下,类型推断可以使代码更易读。当然,如果你编写糟糕的代码(变量名选择不当、方法过长等),留出类型信息可能会使你的糟糕代码变得更糟。因此,请编写良好的代码,并在有助于代码可读性时使用它。 - Brian Goetz
2
我认为这会给代码增加歧义,所以不要这样做。例如,var var = 10,这里的var被推断为long类型。 - Gayan Weerakutti
显示剩余2条评论
1个回答

26

虽然这可能主要基于个人观点,但我会说:不,它不是邪恶的。

var关键字只有在变量类型在编译时已经明确时才允许使用。此外,它将生成相同的字节码,因此没有什么可担心的。

在一些情况下,比如nullvar是不允许的。这并不是邪恶的,而是好的。如果不是这样,Java就不再是静态类型语言了。(然而,需要注意的是,在你列出的大多数情况下,它是被允许的。)

另外,我没有看到你的例子有任何问题。由于在现实世界中,你的.returnsSomething()更可能是像.getPerson()这样的方法,所以读者很清楚var是一个Person。


在 OP 的列表中,null 是唯一一个不起作用的情况。即使对于这种情况,我也不明白如何支持它,例如通过始终推断 Objectnull,会意味着“Java 不再是静态类型语言”。 - Holger
21
关于你的最后一段,假设getPerson()返回一个Person也许是有效的,但这并不重要。请注意原帖作者愿意编写如someObj.getSomeValue().getSomethingElse().returnsSomething()这样的表达式,即使不知道getSomeValue()getSomethingElse()返回的类型是什么。这与编写var x = someObj.getSomeValue(); var y = x.getSomethingElse(); y.returnsSomething()没有什么区别... - Holger
getPerson()。这可能是DTO或JPA实体? - Daniel Jipa
即使在Java代码本身中,你选择的名称也很不合适。 var buffer = response.bufferFactory().wrap(message.getBytes(StandardCharsets.UTF_8)); - Daniel Jipa
只有编译器才能明白这一点。如果没有在某种集成开发环境中检查代码或者了解涉及的所有API,读者将无法理解。在许多情况下,代码变得更加难以阅读。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接