1

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チェックするメソッドがなく、次voidgetVariable(...)返します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));
4

1 に答える 1

3

私はここで比較的新しいのでコメントできません。コメントとして以下を述べたいと思いますので、これについてお詫び申し上げます。

私はあなたがやろうとしていることの前提に疑問を持っています。BeanShell は弱い型付けであるため、void が必要です。私は言うことができprint(x);、このスクリプトでは x は無効です。Java は厳密に型指定されており、このコードはコンパイルされません (明らかに、すべてのクラス/メソッド コードが配置されていると仮定します)。つまり、純粋な Java コードを BeanShell に貼り付ける場合、void が必要になることはありません。

しかし、あなたが主張するなら、eval() コマンドで騙してみることができます。共有メソッドは次のようになります。

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

これは BeanShell では問題ありませんが、今度は Java コードに eval() コマンドを実装する必要がありますが、(前述のように) void の概念がないため、常に false を返す必要があります。

PS void チェックは null チェックの前に来る必要があります。

于 2013-01-07T02:05:28.207 に答える