Java 为什么我不能返回三元运算符的结果?
考虑以下代码:Java 为什么我不能返回三元运算符的结果?,java,ternary,Java,Ternary,考虑以下代码: private static Context myContext; public static Context getInstance() { myContext = myContext == null ? new Context() : myContext; return myContext; } 经过这样的重构后,我的应用程序开始抛出空指针: private static Context myContext; public static Context ge
private static Context myContext;
public static Context getInstance() {
myContext = myContext == null ? new Context() : myContext;
return myContext;
}
经过这样的重构后,我的应用程序开始抛出空指针:
private static Context myContext;
public static Context getInstance() {
return myContext == null ? new Context() : myContext;
}
是否返回myContext并忽略“==”之后的所有内容?
有人能解释一下吗
编辑: 对此做了更多的研究,结果发现这是我的错误:重构代码似乎未能将值分配给上下文类字段 很抱歉给您带来不便 如果有人仍然感兴趣,以下是工作代码片段:
package pckg;
import org.junit.Test;
public class TernaryTest {
@Test
public void testOK(){
Context.getInstance().initialize();
Context.getInstance().setReport(new Report());
Context.getInstance().getReport();
}
@Test
public void testFail(){
Context.getInstanceRefactored().initialize();
Context.getInstanceRefactored().setReport(new Report());
Context.getInstanceRefactored().getReport();
}
}
class Context{
private static Context myContext;
private boolean isInitialized;
private Report report;
public static Context getInstance() {
myContext = myContext == null ? new Context() : myContext;
return myContext;
}
public static Context getInstanceRefactored() {
return myContext == null ? new Context() : myContext;
}
private void checkInitialized() {
if (!isInitialized) {
throw new IllegalStateException("Not initialized.");
}
}
public void initialize() {
if (isInitialized) {
throw new IllegalStateException("Not initialized.");
}
isInitialized = true;
}
public void setReport(Report report) {
this.report = report;
}
public Report getReport() {
checkInitialized();
return report;
}
}
class Report{}
问题是您已经创建了
myContext
的实例,但在第二个版本中,您从未为其赋值,而是创建了一个匿名实例,该实例没有绑定到范围更大的变量myContext
private static Context myContext;
public static Context getInstance() {
return myContext == null
? myContext = new Context() //it is now assigned
: myContext;
}
您的第二个版本从未初始化myContext。如果您除了调用
getInstance()
之外没有其他方法来初始化它,并且您正在类中使用使用myContext
的方法,或者使用返回执行某些操作的myContext
实例的方法,那么是,它将在某处抛出NPE。请显示一个简短但完整的程序来演示该问题。尝试在返回后和分号前添加包含所有内容的括号。尝试使用括号,因为括号内的内容首先运行,然后才能返回值myContext@YaseenKhan:没有,括号不影响执行顺序-它们影响分组。这里的问题不是优先级——这是OP没有向我们展示的东西,比如直接使用myContext
(根据邹祖的评论,这将是空的)。它不会“丢弃”新实例,而是返回它。我假设使用此方法返回的实例甚至是此方法的主要目的。代码中断一次getInstance()
始终返回一个新实例是问题范围之外的严重问题的一个指标;所以你的答案告诉了OP如何使懒洋洋地加载的,可以肯定地认为这不是他的本意。你没有被“抛弃”是对的。它的目的是说它没有被绑定到他的实例变量。我会重申这一点。没错,一直创建一个新实例肯定不是故意的,但这似乎足以发现问题,即使用延迟创建和依赖一段代码在某个时间点已经对延迟创建的实例执行了某个操作是相当矛盾的。这种不一致性很可能会在将来导致问题,即使一直创建新实例的bug已经解决。毕竟,应用程序有一些解耦的代码片段,但仍然依赖于特定的执行顺序。我未能将值分配给字段。这就是答案。