URL#openConnectionによるhttp通信時にBasic認証

Javaの標準機能を使ってhttp通信するときは、URLクラスのopenConnectionメソッドを使って接続するわけだけど、そのときにBasic認証で認証したいときのやりかた。

final String username = "username";
final String password = "p@ssw0rd";
Authenticator.setDefault(new Authenticator(){
    @Override protected PasswordAuthentication getPasswordAuthentication(){
        return new PasswordAuthentication(username, password.toCharArray());
    }
});
  • AuthenticatorクラスのsetDefaultメソッドを呼ぶ。これはstaticメソッド。
  • 引数として、Authenticatorインタフェースを実装したクラスのインスタンスを渡す。
  • いちいちクラスを定義してインスタンスをnewして渡すと面倒なので、匿名クラス(無名インナークラス)で渡すのが簡単。
  • 匿名クラス内のコードから、外の変数を参照する場合、外の変数はfinalにしておくか、インスタンス変数にしておく必要がある。

これを、openConnectionメソッドを呼ぶ前にやっておく。

これでうまくいったから良いけど、なんでこんな仕様なの?あらかじめstaticメソッドを呼んでおくなんて、微妙すぎると思うんだけど。