今日、コア Java (AspectJ なし) のみを使用して、一部のコード セクションが本番環境から削除されることが保証されていることを確認する必要がありました。少し考えた後、契約上のアサーションの概念を完全に悪用する以外に、次のことができることに気づきました。発生する可能性のある実際的な問題を誰かが提案できますか?
public class ProductionVerifier {
static boolean isTest;
static {
// This will set isTest to true if run with -ea, otherwise
// the following line will be removed and isTest will be false.
assert isTest=true;
}
public static final boolean TEST = isTest;
public static final void runOnlyIfInTest(Runnable runable) {
// javac will remove the following section if TEST == false
if (TEST) {
runable.run();
}
}
}
import static ProductionVerifier.*;
public class DemonstrationClass {
private static Runnable notForClient = new Runnable() {
public void run(){System.out.println("h4x0r");}
};
public static void main (String[] args) {
runOnlyIfInTest(notForClient);
}
}
私の最初の主な懸念は、テストコードのスコープが本番環境からアクセスできることでしたが、テストステートメントの各セットを if (TEST) ブロックでラップしたとしても、パターンにはおそらくもっと根本的な問題があると思います.
編集:回答とリンクされた質問から結論を出すと、アサーションを有効にするとシステムの任意のビットの動作が変更されるというメンテナンス/設計上の懸念と、これらのステートメントのコードがTEST はコンパイル時の定数ではないため、実際にはクラス ファイルから削除されません。これらの問題は、アサーション ハックを削除することで解決できますが、必要のないコードをリファクタリングするProductionVerifier
ことが望ましいでしょう。