我试图理解Java 10局部变量类型推断。 我似乎了解这是什么,但是我看不到任何好处。所以我想知道引入此功能的想法是什么。这些只是我的一些观察。如果我错了,请纠正我。
例如(与其他语言不同) 我不能只声明这样的变量
var abc;
我需要初始化它(但不能初始化为null)。所以我什么都没有看到。
我看到的其他参数之一是,以前我们必须声明一个具有其显式类型的变量。
Map<User, String> userChannels = new HashMap<>();
现在我可以这样做
var userChannels = new HashMap<User, String>();
使用现代IDE(例如IntelliJ IDEA)及其对代码完成的支持。我无法想到这会给表带来更多的优势(在上述上下文中)。
我读到的其他一些观点是
多态代码不能很好地与var配合使用。
而且我也不能将var用于匿名类之类的不可表示的类型。
鉴于所有这些,为什么有必要引入此功能?有人可以澄清一下,如果我在这里错过了什么。
答案 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
界面中的内容。因此,如果以后要使用其他实现类,则工作会更加艰巨。