这是正确的吗?
示例代码:
void foo(E param){
if(param == null){
// do this
}else{
// do that
}
//...
}
首先,我阅读了一些帖子,人们在其中讨论允许变量为 null 会增加软件的复杂性 对没有 null 的语言的最佳解释,所以我想努力并忘记这一点来尝试回答这个问题。
想法(我的想法)
作为一个初学者,我的想法可能是错误的,但我希望你能帮我解决这个问题。
我认为根据变量所在的上下文检查变量是否为 null 是正确的,让我用一个例子来解释一下:
使用不当:
我们的项目实现了命令模式,并且我们有一组指令。然后我们在控制台中写一个指令,我们必须解释它。我们有一个解释器类,它试图解析它,所以如果解释器找不到合适的指令,它会返回 null。
代码示例:
public class Interpreter {
public static final String LINE_SEPARATOR = System.getProperty("line.separator");
private static final List<Instruction> listInstructions = loadInstructions();
/**
* Generates a new instruction according to the user input
* @param line - A string with the user input
* @return The instruction read from the given line. If the instruction is not correct, then it returns null.
*/
public static Instruction generateInstruction(String line) throws WrongInstructionFormatException
{
Instruction instru = null;
Iterator<Instruction> it = listInstructions.iterator();
int i = 0;
while(it.hasNext() && i <9 && instru == null)
{
try
{
instru = it.next().parse(line);
}
catch(WrongInstructionFormatException e)
{
}
finally
{
i++;
}
}
return instru;
}
//...
public class MainClass
{
/**
* MainFunction
*/
public void mainFuction()
{
Instruction instru;
while(true)
{
instru = Interpreter.generateInstruction(orden);
if(instru == null) <------
// Error.
else
instru.execute();
}
}
}
好吧,在这种情况下,我认为我们实现了这个错误,因为解释器不能返回 null 而是异常,因为在我看来,这种上下文中的变量永远不会是 null。我希望我很清楚,如果不是,那么我想稍后用你的评论来澄清
正确使用:(已编辑)
我们项目的主类有一组属性,它们都可以被实例化或不被实例化。取决于我们是否实例化了一个,或者两者都没有,将有一组函数来执行一个、两个或不执行任何操作。
public class MainClass extends Observable
{
private A a;
private B b; // This attribute allows you to start making a log in a txt file
private C c; // This attribute allows you to start making a log in a DB
public MainClass(A a){ //....}
public MainClass(A a, B b) { // .....}
public MainClass(A a, C c) { // .....}
public MainClass(A a, B b, C c){ //.....}
public void log(String update)
{
if(this.b != null) <-----
// Save the update in the txt file
if(this.c != null) <-----
// Save the update in a db row
}
}
那么,为什么这是正确的?我认为是正确的,因为属性可能具有空值,而不是像前一种情况那样。
这样就开始了讨论,如果他们有同样的疑问,我希望它可以帮助其他人。