在最近的代码审查中,我被要求default
在所有switch
使用块的文件中放入大小写,即使在中没有任何关系default
。这意味着我必须摆放default
箱子,什么也不要写。
这是正确的做法吗?它有什么作用?
在最近的代码审查中,我被要求default
在所有switch
使用块的文件中放入大小写,即使在中没有任何关系default
。这意味着我必须摆放default
箱子,什么也不要写。
这是正确的做法吗?它有什么作用?
Answers:
似乎在三种情况下default
不需要声明:
不会留下其他情况,因为输入的值集有限switch case
。但这可能会随时间而改变(有意或无意),default case
如果有任何改变,最好_您可以记录或警告用户有关错误的值。
您知道switch case
将在何处使用以及将使用什么值。同样,这可能会改变,可能需要额外的处理。
其他情况不需要任何特殊处理。如果是这种情况,我认为您需要添加default case
,因为它是一种公认的编码样式,它使您的代码更具可读性。
前两种情况是基于假设的。因此(假设您由于没有定期进行代码审查而在一个不太小的团队中工作),则您无法承担这些假设。您不知道谁将使用您的代码或在代码中调用函数/调用方法。同样,您可能需要使用其他人的代码。具有相同的编码样式将使处理某人(包括您)的代码更加容易。
throw new IllegalStateException("Unrecognised case "+myEnum)
您显示错误的位置和错误类似的操作。
else
子句,您也应该始终在每个子句之后都有一个子句if/else if
?对我来说似乎不是个好主意……
这是正确的操作吗?它有什么作用?
公司编码标准要求所有switch
语句都使用默认大小写并不少见。原因之一是它使读者可以轻松找到末尾switch
。另一个可能更好的原因是,它使您思考条件不符合您的期望时代码应该做什么。不管有何要求,如果是公司标准,除非有气密的理由,否则都应遵循。
如果您认为switch
每种情况都包含案例,那么最好assert
在默认案例中添加一条语句。这样,当某人更改了代码并无意中添加了您switch
无法涵盖的条件时,他们会打到assert
并意识到他们需要解决部分代码。
如果您switch
仅涵盖了一些可能的条件,但对其他情况则无需做任何特殊处理,则可以将默认情况保留为空。在这种情况下添加注释以指示默认情况是有意为空是一个好主意,因为达到该条件的条件不需要完成任何工作。
如果“切换”为纯枚举类型,则具有默认回退是很危险的。以后将值添加到枚举类型时,编译器将突出显示未包含新值的开关。如果那里有default子句,编译器将保持沉默,您可能会错过它。
在许多方面,该问题与经常问到的我是否需要else
在if
/ else if
ladder 的末尾包含一个覆盖每个选项的子句相同。
从句法上来说,答案是,不,你不会。但是有一个...
甲default
子句可以在那里为(至少)两个原因:
otherwise
从案例出发。没有任何理由不将这些内容包括在源代码中。我的想法总是很简单-评估这两种方案的最坏情况,并寻求最安全的方案。在为空else
或default
子句的情况下,最坏的情况是:
太过分了吗?也许...但是,如果我的软件出了错,那我就有杀人的潜力。我不想冒险。
else
之后if
。但是正如您所说,不,不是。
Java不强迫你有一个“默认”的语句,但它是很好的做法有一个所有的时间,即使代码可能永远无法达到(现在)。原因如下:
通过使用无法访问的默认子句,可以向代码阅读器显示您考虑的值并知道您在做什么。您还允许将来进行更改,例如:添加了一个新的枚举值,开关不应默默地忽略该新值;否则,您将无法更改。您可以在该处引发Exception或执行其他操作。
要捕获传入的意外值(以防万一您没有打开枚举),例如,它可能大于或小于预期。
处理“默认”操作-这些开关用于特殊行为。例如,变量可能在开关外部声明,但未初始化,并且每种情况都会将其初始化为其他变量。在这种情况下,默认值可能会将其初始化为默认值,因此切换后立即执行的代码不会出错/不会引发异常。
即使您决定不将任何内容设置为默认值(没有异常,日志记录等),也可以使用一条评论说您认为默认值将永远不会发生,这可能有助于提高代码的可读性。但这取决于个人喜好。
考虑
enum Gender
{
MALE ,
FEMALE ;
}
和
void run ( Gender g )
{
switch ( g )
{
case MALE :
// code related to males
break ;
default :
assert Gender . FEMALE . equals ( g ) ;
// code related to females
break ;
}
}
我认为这比具有MALE情况,FEMALE情况和引发异常的默认情况更好。
在测试阶段,计算机将检查g是否为FEMALE。在生产过程中,将省略检查。(是的,微优化!)
更重要的是,您将保持100%代码覆盖率的目标。如果您编写了一个引发异常的默认案例,那么您将如何对其进行测试?
Gender . FEMALE . equals ( FEMALE ) ;
评估false
?您的意思是,Gender.FEMALE.equals (g)
但是由于可以依赖对稳定枚举的引用,因此可以编写g == Gender.FEMALE
。4.(个人意见)这样的代码更难阅读,并且会产生稍微混乱的错误。