在BeanShell中变量可以是null
或void
。是否有一种方法可以使用在BeanShell和Java中都可以工作(未修改,即复制/粘贴)的代码来测试(或至少void
)?例如:SomeUtilityClass.isNullOrVoid(...)
。跨语言的Java/Beanshell方法来检查void和null
我使用复杂的BeanShell脚本并能够将代码从Java IDE复制/粘贴到脚本中,这对我的工作效率和代码质量有很大帮助(是的,这意味着我没有使用BSH的脚本功能) 。唯一的问题是测试void
,这迫使我以后手动调整每个脚本。
问题与void
:
- 一种
null
检查没有赶上void
:
String foo; System.out.println("is null: "+ (foo == null));
打印is null: false
,从而导致如下代码if (var != void && var != null) { ... }
不工作Java(并且将void
声明为常量是不可能的,因为它是保留字)
bsh.NameSpace
没有一个方法来检查void
和getVariable(...)
回报void
:
String foo; System.out.println("variable: "+ this.namespace.getVariable("foo"));
打印variable: void
所以我们又回到了起点。即使有一种方法可以做到这一点(比方说我会用适当的方法编写一个自定义的NameSpace子类,并且它需要以一种跨环境的方式调用它(见下一点)。
- 用类似
isNull(Object bshNameSpace, String varName, Object var)
的方法编写自定义帮助类似乎是不可能的。
的helper方法是这样的:
public class Helper {
public static boolean isNullOrVoid(This bshThis, String name) throws Exception {
Primitive p = (Primitive) bshThis.getNameSpace().getVariable(name);
return p == Primitive.NULL || p == Primitive.VOID;
}
}
作品从BeanShell的就好了,但也没有办法(我知道)返工它在Java中的工作(使用反射或其他方式),因为它需要使用方法变量而不是实例字段。另一种(笨)版本:从Java
public static boolean isNullOrVoid(Object bshThis, String name, Object var) throws Exception {
if (!(bshThis instanceof This)) {
return var == null;
}
Primitive p = (Primitive) ((This)bshThis).getNameSpace().getVariable(name);
return p == Primitive.NULL || p == Primitive.VOID;
}
的作品,但没有BeanShell的,如果第三个参数是未定义的说法。
- 声明自定义BSH命令也不是一个选项。
即使辅助方法在脚本本身它爆炸完全相同的方式与未定义参数例外规定:
public boolean isNullOrVoid(Object var) {
return var == null || var == void;
}
String foo;
System.out.println(isNullOrVoid(foo));
究竟是什么版本的Beanshell你使用,因为我试过你的代码示例,我没有看到任何返回“无效”。哎呀,“void”甚至不是Java中的一种类型。如果它返回“Void”,它会有点意义,但这也不是这种情况。 –