BeanShell では、変数はnullまたはvoidです。voidBeanShell と Java の両方で動作する (変更されていない、つまりコピー/貼り付けされた) コードを使用して、両方 (または少なくとも) をテストする方法はありますか? 次のようなもの: SomeUtilityClass.isNullOrVoid(...).
私は複雑な BeanShell スクリプトを扱っており、コードを Java IDE からスクリプトにコピー/貼り付けできるので、生産性とコードの品質が大幅に向上します (つまり、BSH のスクリプト機能を使用していないということです)。void唯一の問題は、後で各スクリプトを手動で調整する必要があるテストです。
に関する問題void:
nullキャッチしないのチェックvoid:
String foo; System.out.println("is null: "+ (foo == null));
これは、 Javaでは機能しないis null: falseようなコードにつながります (予約語であるため、定数として宣言することはできません)。if (var != void && var != null) { ... }void
bsh.NameSpaceチェックするメソッドがなく、次voidをgetVariable(...)返しますvoid。
String foo; System.out.println("variable: "+ this.namespace.getVariable("foo"));
印刷variable: voidされるので、振り出しに戻ります。そこにそれを行うメソッドがあったとしても (たとえば、適切なメソッドを使用してカスタム NameSpace サブクラスを作成するとsetNameSpace(...)します)、クロス環境でそれを呼び出す方法が必要になります (次のポイントを参照)。
- メソッドのようなカスタムヘルパークラスを書く
isNull(Object bshNameSpace, String varName, Object var)ことは不可能のようです。
次のようなヘルパー メソッド:
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 で動作するように作り直す方法 (私が知っている) はありません。別の (不格好な) バージョン:
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;
}
3 番目のパラメーターがUndefined argumentの場合、Java からは機能しますが、BeanShell では機能しません。
- カスタム BSH コマンドを宣言することもオプションではありません。
ヘルパー メソッドがスクリプト自体で定義されている場合でも、未定義の引数例外でまったく同じように爆発します。
public boolean isNullOrVoid(Object var) {
return var == null || var == void;
}
String foo;
System.out.println(isNullOrVoid(foo));