当我从中读取源代码时java.io.BufferedInputStream.getInIfOpen()
,我很困惑为什么它编写了这样的代码:
/**
* Check to make sure that underlying input stream has not been
* nulled out due to close; if not return it;
*/
private InputStream getInIfOpen() throws IOException {
InputStream input = in;
if (input == null)
throw new IOException("Stream closed");
return input;
}
为什么使用别名而不是in
直接使用field变量,如下所示:
/**
* Check to make sure that underlying input stream has not been
* nulled out due to close; if not return it;
*/
private InputStream getInIfOpen() throws IOException {
if (in == null)
throw new IOException("Stream closed");
return in;
}
有人可以给出合理的解释吗?
如果您是从上下文中看这段代码,那么对于“别名”将没有很好的解释。它仅仅是冗余代码或不良的代码样式。
但是上下文是BufferedInputStream
可以被子类化的类,它需要在多线程上下文中工作。
线索是,in
在宣布FilterInputStream
IS protected volatile
。这意味着子类有可能进入并分配null
给in
。考虑到这种可能性,实际上会使用“别名”来防止出现竞争状况。
考虑不带“别名”的代码
private InputStream getInIfOpen() throws IOException {
if (in == null)
throw new IOException("Stream closed");
return in;
}
getInIfOpen()
in == null
得出in
的结果不是null
。null
给in
。return in
。null
之所以返回,a
是因为volatile
。“别名”可以防止这种情况。现在in
,线程A仅读取一次。如果线程B
null
在线程A之后分配in
,则没有关系。线程A将抛出异常或返回(保证的)非空值。
当我从,我不明白它为什么会这样写代码: 为什么它使用别名,而不是直接在中使用字段变量
问题内容: 我正在阅读的源代码,并发现了一些我不理解的代码: 注意这一行: 为什么不直接使用它,而是将其分配给局部变量? 问题答案: 可能是出于 优化 目的吗? 可能可以通过JIT编译器更轻松地将局部变量直接分配给寄存器。 至少在Android中,对于API的第一个版本,访问局部变量比访问实例变量便宜(不能代表较新的版本)。普通的Java可能是相同的,在某些情况下使用本地是有意义的。 实际上,在这
如果我在我的类中创建一个bool,就像一样,它默认为false。 当我在我的方法中创建相同的bool时,我得到一个错误“使用未分配的局部变量检查”。为什么?
:我知道如何: 运行不带参数的私有void方法 :我知道如何: 设置任意类型的私有字段 设置任意类型的私有静态字段 设置任意类型的私有最终字段 设置任意类型的私有静态最终字段 :我知道如何: 获取任何类型的私有字段 :我知道如何: (可用于以单模式创建私有构造函数的新实例,同时保持实例Field为空) 创建不带参数的私有构造函数的新实例 我不知道的,我想知道的: 获取任何类型的私有静态字段,并将其
本地风险值背后的想法是最终的,而领域不是。
我看到了这种奇怪的行为,我想知道是否有合理的解释: 当我(意外地)在函数的局部变量中添加了一个额外的分号时,如: 它确实可以编译,但它表明它是多余的。 但当我对字段执行此操作时(也是偶然),我得到了一个错误(编译): 问题 是否有任何理由限制这些领域? Nb我已经知道了不允许带有字段的另一个限制因素。但这里有所不同。