コンストラクターに送信されるパラメーター (文字列パス) がディレクトリにできない場合、コンパイラーにエラーを与えるように強制するにはどうすればよいですか?
import java.io.File;
public class Folder {
protected File file;
public Folder(String Path){
file = new File(Path);
}
}
コンストラクターに送信されるパラメーター (文字列パス) がディレクトリにできない場合、コンパイラーにエラーを与えるように強制するにはどうすればよいですか?
import java.io.File;
public class Folder {
protected File file;
public Folder(String Path){
file = new File(Path);
}
}
コンパイルエラーにすることはできません(もちろんコンパイラを書き直さない限り、それでもコンパイル時に文字列が有効なディレクトリであるかどうかを判断できないと思います)。
Java でこれを処理する標準的な方法は、例外をスローすることです。次に例を示します。
if (isNotValid(path)) { //condition to be defined
throw new IllegalArgumentException(path + " is not a valid path");
}
おそらく、ある種の注釈プロセッサを使用します。
しかし、それはかなり奇妙な要件です。コンパイル時にはディレクトリであるが、実行時ではない場合はどうなりますか?
すべてのビルドで実行される自動単体テストを使用して、同様の機能を実現できます。
まず、パスが有効でない場合に a がスローFolder
されるように、コンストラクターでパラメーターを検証する必要があります。Exception
次に、すべてのコードを実行してテストする単体テストを作成します。テストが失敗すると、BUILD も失敗し、プロジェクトのパッケージ全体が失敗します。(例: ハードコードされたディレクトリにアクセスできません) これはコンパイラ エラーによく似ており、ビルド プロセスは失敗します。(確かに同じではありません)
テストは、テストしたコードが目的の方法で機能することを確認します。
もちろん、すべてのビルドで単体テストが自動的に実行される maven のようなビルド ツールを使用している場合、これはより簡単です。
何のディレクトリにすることはできませんか? Windows では? Linuxでは?
Java はクロスプラットフォームであり、すべてのプラットフォームには独自の仕様があります (たとえば、Windows では*
ディレクトリ名に使用できませんが、Linux では使用できます...)。
実行時にメソッド内から File クラスのisDirectory()メソッドを確認するだけでよいと思います。
コンパイル時エラーはあり得ません。
それでも、この実装を検討してください:
public class Folder {
private final File folder;
public Folder(String path) {
this(new File(path));
}
public Folder(File folder) {
if (!folder.exists() || !folder.isDirectory()) {
throw new IllegalArgumentException();
}
this.folder = folder;
}
// add useful methods possibly delegating to contained File object ...
}
これにより、非ディレクトリ ファイルを含む Folder オブジェクトが作成されるのを効果的に防止できます。また、フォルダー フィールドをプライベートに設定しているため、他のクラスがそれを改ざんできないことにも注意してください。