BeanShell では、変数はnull
またはvoid
です。void
BeanShell と 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));