2012-10-09 26 views
1

在BeanShell中变量可以是nullvoid。是否有一种方法可以使用在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没有一个方法来检查voidgetVariable(...)回报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)); 
+0

究竟是什么版本的Beanshell你使用,因为我试过你的代码示例,我没有看到任何返回“无效”。哎呀,“void”甚至不是Java中的一种类型。如果它返回“Void”,它会有点意义,但这也不是这种情况。 –

回答

2

因为我是比较新在这里我不能作出评论。我对此表示歉意,因为我希望将以下内容作为评论。

我的确质疑你要做什么的前提。 BeanShell是弱类型的,这就是为什么你需要void。我可以说print(x);,在这个脚本中x是无效的。 Java是强类型的,并且这个代码不会编译(显然,假设所有的类/方法代码都在)。这意味着如果您将纯Java代码粘贴到BeanShell中,那么您绝对不应该遇到void的需求。

但是,如果你坚持,你可以尝试与eval()命令混淆。共享方法看起来像:

boolean isNullOrVoid(Object o) { 
return eval("o == void") || o == null; 
} 

这是罚款BeanShell的,但现在你必须在你的Java代码来实现的eval()命令,而是因为(如前所述),不存在无效的概念,那么它应该总是返回false。

PS无效检查应该在空检查之前。