メソッド呼び出しの除去
結果の出力に存在してほしくないメソッド呼び出しがプロジェクトの入力に含まれている場合は、PreEmptive Protection™ DashO™ for Android & Java を使用してそれらを除去することができます。 これは特に、ログ呼び出しなど、開発時には役立つが本番環境では好ましくない呼び出しに有用です。 メソッド呼び出しの除去によって、指定されたメソッドへの呼び出しがすべての入力クラスから除去されます。メソッド自体は削除されません。
直接指定されたクラスに対するメソッドへの呼び出しのみ除去され、指定されたメソッドのサブクラスに対する同じメソッド名や署名への呼び出しは除去されません。
これは、サブクラスが実際にはメソッドを実装していなくても当てはまります。継承されたメソッドの解決は、実行時に JVM によって行われます。
したがって、この機能は final
とマークされたクラスで最も効果的です(final である必要はありません)。
メモ:DashO のメソッド呼び出しの除去は Android モードでは利用できませんが、Android モードの使用時は R8 を構成してメソッド呼び出しの除去を実行できます。
メソッド呼び出しの除去の設定
メソッドの呼び出しの除去は DashO GUI の Method Call Removal ページで設定できます。 他の多くの機能の規則とは異なり、メソッド呼び出しの除去規則では、クラス名、メソッド名、および署名での正規表現はサポートされません。 さらに、メソッド呼び出しの除去から、メソッドまたはクラスを除外することはできません。 すべての入力で指定されたメソッドへの呼び出しがすべて除去されます。
動作への影響
メソッド呼び出しの除去は、プログラムの動作に影響を与えます。 メソッドの呼び出しを除去すると、わずかな副作用をもたらす可能性があるため、この機能は慎重に使用する必要があります。
void でないメソッドの呼び出しの除去は、メソッドからの戻り値が実際に使用されているかどうかにかかわらず適用されます。
void でないメソッドの呼び出しが除去された場合、呼び出しの代わりに既定値が結果として提供されます。
この値は、メソッドの戻り値の型に応じて適切に、ゼロ、false、または null のいずれかになります。
たとえば、戻り値の型 Double
、int[]
、および Set<String>
を置き換えた結果は、すべて null
になります。
これにより、予期しない問題が発生する可能性があります。
メソッド呼び出しの除去は、そのメソッド呼び出しを含んでいる式も含め、呼び出しの外部のバイトコードを変更しません。
String[] pathSplitterToRemove(String path) { ...}
...
String message = "First path: " + pathSplitterToRemove(path)[0]; // null 配列のアクセス
コードが、その結果によって何かをしているかどうかさえ明らかでない場合があります。
Double methodCallToRemove() { ... }
...
double ignoredValue = methodCallToRemove(); // null をボックス化解除する
(2 つの *ToRemove
メソッドの)メソッド呼び出しを除去した後、上記の例はどちらも NullPointerException
をスローします。