Java 10局部变量类型推理优势?

时间:2019-01-03 11:41:01

标签: java java-10

我试图理解Java 10局部变量类型推断。 我似乎了解这是什么,但是我看不到任何好处。所以我想知道引入此功能的想法是什么。这些只是我的一些观察。如果我错了,请纠正我。

  1. 例如(与其他语言不同) 我不能只声明这样的变量

    var abc;
    

    我需要初始化它(但不能初始化为null)。所以我什么都没有看到。

  2. 我看到的其他参数之一是,以前我们必须声明一个具有其显式类型的变量。

    Map<User, String> userChannels = new HashMap<>();
    

    现在我可以这样做

    var userChannels = new HashMap<User, String>();
    

使用现代IDE(例如IntelliJ IDEA)及其对代码完成的支持。我无法想到这会给表带来更多的优势(在上述上下文中)。

我读到的其他一些观点是

多态代码不能很好地与var配合使用。
而且我也不能将var用于匿名类之类的不可表示的类型。

鉴于所有这些,为什么有必要引入此功能?有人可以澄清一下,如果我在这里错过了什么。

2 个答案:

答案 0 :(得分:7)

原因之一是它使您的代码更短且更易于阅读。考虑下面的示例,在该示例中,声明后仅使用一次或两次。

ReallyLongClassNameBecauseBigEnterpriseProject reallyLongClassAbv = new ReallyLongClassNameBecauseBigEnterpriseProject(foo);
OtherAnnoyingLongClassName otherAnnoyingLongClassName = reallyLongClassAbv.getOtherAnnoyingLongClassName();

如果变量名称与类具有相同的名称(或缩写名称,因为可以通过上下文或构造函数推导该类),则该类名称不会添加太多信息。但是如果你写

var reallyLongClassAbv = new ReallyLongClassNameBecauseBigEnterpriseProject(foo);
var otherAnnoyingLongClassName = reallyLongClassAbv.getOtherAnnoyingLongClassName();

它已经更好,更快地读取了,并且由于您已经有了类名,因此不会丢失任何信息。另外,您的变量名甚至可以对齐!
您可能会认为这没什么大不了,但是根据我的经验,我曾在充满这些语句的项目中工作过,我真的希望我不必在每个声明中读取类名的两倍或三倍。 var关键字可能会增加信息/文本比率,并使代码的详细程度降低。

注意:为了清楚起见,即使使用var,您仍应避免给班级使用无用的长名称,但有时您没有选择的余地来自另一个图书馆。


如评论中所述,您可以查看JEP以获得更完整的答案,以及Stuart Marks的Style Guidelines for Local Variable Type Inference


幽默地讲:您可以在这里查看如何Enterprisify your Java Class Names的讽刺,或者像InstantiationAwareBeanPostProcessorAdapter这样的真实示例。

答案 1 :(得分:6)

优点:代码较短

StringBuilder buffer = new StringBuilder();  // traditional
var buffer = new StringBuilder();            // new

缺点:在某些情况下不够清晰

Person theFirst = phoneRegister.values().iterator.next();   // At least you know it's a Person
var theFirst = phoneRegister.values().iterator.next();      // Quite a task to find out the type.

希望您不会在任何生产代码中找到这样的行,即使是第一个。

缺点:实现类型而不是接口

Map<User, String> userChannels = new HashMap<>();   // interface type
var userChannels = new HashMap<User, String>();     // this gives a HashMap variable

使用“ var”版本时,您将获得一个声明为HashMap而不是Map的变量,从而无声地允许您使用HashMap类中实现的所有其他方法,而不仅仅是Map界面中的内容。因此,如果以后要使用其他实现类,则工作会更加艰巨。