我被告知对局部变量的接口进行编程是没用的,不应该这样做,因为它只会伤害性能并且没有任何好处.
public void foo() {
ArrayList<Integer> numbers = new ArrayList<Integer>();
// do list-y stuff with numbers
}
Run Code Online (Sandbox Code Playgroud)
代替
public void foo() {
List<Integer> numbers = new ArrayList<Integer>();
// do list-y stuff with numbers
}
Run Code Online (Sandbox Code Playgroud)
我觉得性能命中率可以忽略不计,但可以肯定的是,使用ArrayList的List语义并没有太大的收获.是否有充分理由采取这种或那种方式?
java中的final方法不能被继承的类覆盖。
但是,为什么使用invokevirtual而不是调用最终方法invokespecial。
一位演讲者刚刚提到更改为var是有用的语法糖(对齐变量名称)。我以为我会检查并发现...
List<String> list = new ArrayList<>(); // IMO this is safer future-proof coding
list.add("HELLO WORLD");
Run Code Online (Sandbox Code Playgroud)
... 使用invokeinterface调度生成字节码...
11: invokeinterface #12, 2 // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
Run Code Online (Sandbox Code Playgroud)
转换为 Java 10+ var...
11: invokeinterface #12, 2 // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
Run Code Online (Sandbox Code Playgroud)
... 使用invokevirtual调度生成字节码...
11: invokevirtual #12 // Method java/util/ArrayList.add:(Ljava/lang/Object;)Z
Run Code Online (Sandbox Code Playgroud)
例如,我是否应该关注批量升级整个应用程序的源代码var?例如,敏感部分会更慢(还是更快?!假设invokeinterface涉及更多步骤?)除此之外,是否还有其他非技术影响(例如,我看到了一个关于离线代码审查清晰度的有趣评论)