uehaj's blog

Grな日々 - GroovyとかGrailsとかElmとかRustとかHaskellとかReactとかFregeとかJavaとか -

GroovyなBASIC認証

JavaBASIC認証するのは、ちらっとめんどい。

http://d.hatena.ne.jp/nacookan/20071109/1194592229

を参考にすれば、

import java.net.Authenticator;
 :
final String username = "username";
final String password = "p@ssw0rd";
Authenticator.setDefault(new Authenticator(){
    @Override protected PasswordAuthentication getPasswordAuthentication(){
        return new PasswordAuthentication(username, password.toCharArray());
    }
});

このぐらいのコードが必要です。

まあ実質3行ぐらい。内部クラスをうまく使った、Javaとしてはコンパクトなコードになってますね。でもこれをGroovyにすると、

String username = "username";
String password = "p@ssw0rd";
Authenticator.default = {
 [username, password.toCharArray()] as PasswordAuthentication
} as Authenticator

こうなります。Groovyの以下の機能を使っています。

  • n要素の配列をクラスにasすると、そのクラスにn要素の引数を取るコンストラクタが定義してあればその配列をコンストラクタのパラメタとして*してコンストラクタが呼ばれる(newされる)現象
  • クロージャを1メソッドのインターフェースに明示的にasするとそのインターフェースをimplementsした1つのメソッドを持つクラスが定義されnewされる(そのメソッドは件のクロージャに割り当てられる)現象
  • setterメソッドの呼び出しはプロパティへの代入として記述できる
  • Javaの内部クラスからのアクセスの場合には「final変数のみアクセス可能」という制約があるがGroovyのクロージャには無い
  • java.net*はデフォルトでインポートされているので明示的なimport不要