Java开关常量表达式。。。有什么聪明的方法可以让它编译吗?
在远离Java开发多年后,我将重返Java开发。是否有任何方法可以编译此代码Java开关常量表达式。。。有什么聪明的方法可以让它编译吗?,java,Java,在远离Java开发多年后,我将重返Java开发。是否有任何方法可以编译此代码 class Mpeg4 { public static final int FourCC2Int(char aA, char aB, char aC, char aD) { return (aA << 24) | (aB << 16) | (aC << 8) | (aD); } public static vo
class Mpeg4
{
public static final int FourCC2Int(char aA, char aB, char aC, char aD)
{
return (aA << 24) | (aB << 16) | (aC << 8) | (aD);
}
public static void main(String aArgs[]) throws Exception
{
int x = Integer.parseInt(aArgs[0]);
switch (x)
{
case Mpeg4.FourCC2Int('f', 't', 'y', 'p'): // This won't be reduced by the compiler to a constant.
// doSomething();
break;
}
}
}
语言有了很大的变化,我也用谷歌搜索过。有没有办法让我的代码保持整洁
i、 e.不手动减少“宏”或存在潜在的大量if-then-else-if块?
也许编译器优化标志可能是一种途径?我觉得这种情况很糟糕。你可以这样做
switch (x) {
case ('f' << 24) | ('t' << 16) | ('y' << 8) | ('p'):
// doSomething();
break;
}
开关(x){
case('f'Nope-该值在编译时必须是常量。KFtyp
在类加载时是常量
Java7在这方面让您松了一口气(开关中允许进行字符串比较)
但是,对单个变量进行长系列检查的开关是最不有用的结构之一。通常,具有不同实现者的接口或具有通过构造定义正确行为的子类的超类是更好的选择。switch
需要编译时常量表达式(对于整型或枚举类型,从Java 7到字符串),并且方法调用的结果不是编译时常量。(编译器不会调用您的方法。)
如果您只需要单个(或少量)案例块,请改用If
如果你有一个很大的数字,你可以考虑在命令模式中使用HashMap或类似的东西,或者让其他程序生成你的代码(例如,如果你正在编写解析器).还要添加枚举文字,这些文字在case语句中根据-1是有效的,完全失去了检查的语义意义。使用枚举。它可以工作,但相当混乱。我确信hotspot编译器最终会生成我想要的内容,但我发现javac编译器不会,纯粹是为了保持我的代码干净,这让我感到沮丧。将有许多十个要运行该程序,您需要知道十进制值(1718909306),那么为什么不在您的案例中使用它呢?
?在用户非常困难的情况下,您希望为程序员提供一个方便的表单,这似乎有点奇怪。我上面写的只是为了说明这一点。我的真实代码通过FileInputStream解析真实的文件。这可能就是路径。我希望避免使用OO crud我有点困惑javac不会做热点编译器最终会做的事情。如果你可以使用java7,那么创建一个四位数的字符串而不是int
,再加上新的字符串开关,可能会有所帮助。
switch (x) {
case ('f' << 24) | ('t' << 16) | ('y' << 8) | ('p'):
// doSomething();
break;
}