凪瀬 Blog
Programming SHOT BAR

目次

Blog 利用状況
  • 投稿数 - 260
  • 記事 - 0
  • コメント - 46740
  • トラックバック - 192
ニュース
広告
  • Java開発者募集中
  • 経歴不問
  • 腕に自信のある方
  • 富山市内
  • (株)凪瀬アーキテクツ
アクセサリ
  • あわせて読みたい
凪瀬悠輝(なぎせ ゆうき)
  • Java技術者
  • お茶好き。カクテル好き。
  • 所属は(株)凪瀬アーキテクツ
  • Twitter:@nagise

書庫

日記カテゴリ

 

ネットを彷徨っていたら面白いJavaコードを見かけました。

[Java]きもい呼び方

public class ExecuteMain {

    public interface Operation<T> {
    }

    public static void main(String[] args) {
        Integer integer = new Operation<Integer>() {
            public Integer execute() {
                return new Integer(111);
            }
        }.execute();
        System.out.println(integer);
    }
}

シンタックスハイライト、強調は私の加工です。

execute()メソッドは無名クラスにしか定義されていないのだけども、 newした時点ではOperation型ではなくてOperationを継承した無名のクラスの型なので、 その型で宣言されているexecute()メソッドが呼べてしまうという代物。

このOperationを継承した無名クラスをOperation型に代入してしまうと、 もはやOperation型としてしか扱えないので、リフレクションを除いてexecute()メソッドを呼ぶ術がない。

newした時点だけで呼べるのだけども、メソッド呼び出しをしちゃうと無名クラスのインスタンスを 保持することができないというのもあるし、使い道は皆無でしょうね。

投稿日時 : 2008年5月20日 13:43
コメント
  • # re: 代入されるまでは固有のクラスだからか
    シャノン
    Posted @ 2008/05/20 13:46
    > メソッド呼び出しをしちゃうと無名クラスのインスタンスを保持することができない
    execute が return this; すれば可能かも?
  • # re: 代入されるまでは固有のクラスだからか
    凪瀬
    Posted @ 2008/05/20 13:50
    一応、return thisとか、コンストラクタ内でthis参照をグローバルに外に渡すとか、初期化ブロックつかってグローバルに外に渡すとか、参照を維持することはできなくはないんですが…。
    いかんせん、利用してメリットがある使いどころが思い浮かびません。
  • # re: 代入されるまでは固有のクラスだからか
    shot
    Posted @ 2008/05/20 14:26
    使い道はあまりないでしょうねえ。

    あえて言うならば、本当にインスタンス時に一度しか
    呼ばれないくらい。他に方法いっぱいありますけど^^;
  • # re: 代入されるまでは固有のクラスだからか
    凪瀬
    Posted @ 2008/05/20 14:31
    引用させて頂いています。

    > あえて言うならば、本当にインスタンス時に一度しか呼ばれないくらい。

    無名クラスの作り手、そのメソッドの呼び手が一緒なんですよね。interfaceの作り手はあるいは違うかもしれない。
    そもそも、一度しか「呼ばせない」という制約を課せられるものでもなく…
    さらには、作り手と使い手が同じなので、ことさらナンセンスですよね。

    あぁ、なんてナンセンスなんだ。(うっとり

  • # re: 代入されるまでは固有のクラスだからか
    NyaRuRu
    Posted @ 2008/05/20 20:36
    式の一部で lightweight に型を定義する仕組みと,C# の var や C++ の auto のような仕組みは相性が良いですね.
タイトル
名前
Url
コメント