Java &引用;但是编译器没有';我不知道这一点什么';这是什么意思?
我在Java &引用;但是编译器没有';我不知道这一点什么';这是什么意思?,java,java-9,Java,Java 9,我在java.util.ImmutableCollections类中遇到过这样的代码和注释: static final class List0<E> extends AbstractImmutableList<E> { ... @Override public E get(int index) { Objects.checkIndex(index, 0); // always throws IndexOutOfBoundsExcep
java.util.ImmutableCollections
类中遇到过这样的代码和注释:
static final class List0<E> extends AbstractImmutableList<E> {
...
@Override
public E get(int index) {
Objects.checkIndex(index, 0); // always throws IndexOutOfBoundsException
return null; // but the compiler doesn't know this
}
...
}
静态最终类列表0扩展了AbstractImmutableList{
...
@凌驾
公共E-get(int索引){
Objects.checkIndex(index,0);//始终引发IndexOutOfBoundsException
返回null;//但编译器不知道这一点
}
...
}
为什么不抛出新的IndexOutOfBoundsException(…)?原因是什么?也许,这只是为了避免代码重复,否则它会像:
new IndexOutOfBoundsException(outOfBoundsMessage(..., ...))
但是
outOfBounds*
方法是private
,因此通过设计,应该调用像这样的包装器来返回前提条件。checkIndex(index,length,null)
除非我在这里遗漏了一些明显的东西,否则这要简单得多。这与:
// this will not compile, *even* if test throws the Exception always
public String s() {
test();
}
private void test() {
throw new RuntimeException("just because");
}
编译器无法判断test
是否总是抛出RuntimeException
,因此它需要s()
中的return
语句。枚举的switch
语句中也会发生同样的情况,您必须提供一个throw
;即使您已经处理了该枚举的所有案例
顺便说一句,此代码用于
List0
,在这里调用get(x)
没有意义,因为列表中没有确定的元素。这里的实现似乎更面向设计,而不仅仅是功能
原因可能主要是先决条件.checkIndex
被标记为@hospotintrisccandidate
,这意味着在内部使用此方法时,会寻求代码性能改进
另外,您可以注意到,使用的工厂方法创建的包含0(空)、1、2或N个元素的所有不可变列表都使用了,它最终依赖于上面的方法调用来进行一些内部优化
从库中简要介绍Hotspotintrisccandidate:-
@hospotintrinsicandidate
注释特定于
热点虚拟机。它表示带注释的方法可能(但不保证)由HotSpot VM内部化
如果HotSpot VM替换带注释的
具有手写程序集和/或手写编译器的方法
--编译器的内在特性--提高性能
@hospotintrinsicandidate
注释是Java的内部注释
图书馆,因此不应该与
应用程序代码
@我不是真的。。。您始终可以编写
公共字符串s(){throw new RuntimeException(“aaa”);}
什么是100%有效和可编译的代码如果您提到@hospotintrisccandidate
您可以提到对象的@ForceInline
。另外,这是有趣的,因为CPU究竟是如何优化这个内在调用的;我不知道btw@EugeneForceInline
似乎专注于忽略带注释方法的度量,因此避免将其纳入讨论。我自己也还没有深入研究过Hotspotintrisccandidate的实现。在实现过程中没有太多可看的东西……)这只是一个注释,您必须挖掘jvm源文件,并查看该方法的具体操作……是的,避免代码重复。我们正在努力集中所有这些索引检查和异常消息构造。这不仅会影响集合实现和数组
实用程序方法,还会影响NIO缓冲区、CharSequence
实现等等。很多地方,很多代码重复。请注意,这是一个允许应用程序参与此中央处理的过程。尽管如此,我还是会使用抛出新的AssertionError()
而不是返回null代码>这里…哦,霍尔格大师,我感谢您对我的回答和您的补充评论的赞赏。在这个问题上也非常需要你的权威意见: