ここには非常に「設計された」例がありますのであなたのコードには使用しないでください
私は、サプライヤではなく述語を使って効果を実証できると思います。
は、次のようにパスワードチェッカーを実装すると仮定します
public class PasswordChecker {
private final String secretPassword;
public PasswordChecker(String secretPassword) {
this.secretPassword = secretPassword;
}
public boolean test(String password) {
return Objects.equals(this.secretPassword, password);
}
}
その後、あなたの周りのパスにそれをインスタンスを作成することができます。
final PasswordChecker passwordChecker = new PasswordChecker("changeit");
そしてどこかにあなたがパスワードを確認するためにそれを使用することができました:
assertThat(passwordChecker.test("foobar")).isFalse();
ただし、のインスタンスを持つクライアントの場合手で、いくつかの反射とパスワードを抽出するためにそれほど難しいことではありません。
Field secretPasswordField = passwordChecker.getClass().getDeclaredField("secretPassword");
secretPasswordField.setAccessible(true);
String secretPassword = (String) secretPasswordField.get(passwordChecker);
System.out.print(secretPassword);
は今ここにクロージャと同じことだ:
final String secretPassword = "changeit";
final Predicate<String> passwordChecker = password -> Objects.equals(secretPassword, password);
は今、あなたはpasswordChecker
からsecretPassword
を抽出することはできません。
私はこれが好きです。あなたの述語にあらゆる種類の機能(valdiation、hashingなど)を焼くことができます。 – Raudbjorn
申し訳ありませんが、私は仕事によって "int erupted"を得ました、私は答えを見るときにサンドイッチを食べていました。たぶん私は質問が始まった場合、アップアップしたでしょう:閉鎖を使用することは、あなたのフィールドを反射から守ることから保護します。しかし、それ以外にパスワードの検証*はパスワードハッシュやSRPなどを使って実装する必要があります。その場合、クロージャーはもう意味をなさない。あなたのコードでは、 'equals'メソッドを使ってパスワードの検証に対して時間ベースの攻撃を導入しています。 –
コードが安全でない旨の警告を表示し、反射がうまくいかないという主張の参照を表示すると、私はupvoteに満足しています。 –