新しいメソッドを追加した匿名クラスのオブジェクトをインスタンス化しました。
Date date = new Date() {
public void someMethod() {}
}
次のような形で外部からこのメソッドを呼び出すことができるかどうか疑問に思っています。
date.someMethod();
新しいメソッドを追加した匿名クラスのオブジェクトをインスタンス化しました。
Date date = new Date() {
public void someMethod() {}
}
次のような形で外部からこのメソッドを呼び出すことができるかどうか疑問に思っています。
date.someMethod();
良い質問。答えはノーです。直接呼び出すことはできませんdate.someMethod();
。まず、これが何であるかを理解しましょう。
Date date = new Date() { ... };
上記は、Date クラスを拡張する匿名 (名前のない) サブクラスです。
次のようなコードを見ると、
Runnable r = new Runnable() {
public void run() {
}
};
これは、Runnable インターフェイスを実装する (拡張しない) 匿名 (名前がない) クラスを定義したことを意味します。
上記の場合、スーパークラスはクラスで定義されていないため、呼び出すと呼び出すことがdate.someMethod()
できません。単純なオーバーライド規則に従います。someMethod
superclass.
Date
それでも電話をかけたい場合someMethod
は、次の手順を実行します。
最初の方法>
参照変数 ' date
' を使用する
date.getClass().getMethod("someMethod").invoke(date);
2番目の方法>
Dateクラスのオブジェクトの新しく作成された匿名サブクラスを使用。
new Date()
{
public void someMethod() {
System.out.println("Hello");
}
}.someMethod(); //this should be without reference 'date'
基本的にいいえ。
しかし、この醜さはそれを行うことができます...
Date date = new Date() {
public Date someMethod() {
//do some stuff here
return this;
}
}.someMethod();
ただし、これとは別に、次のように、リフレクションのみを使用してそのメソッド (親クラスには存在しない) を呼び出すことしかできません。
date.getClass().getMethod("someMethod").invoke(date);
(わかりやすくするために、try-catch は省略しています...)
しかし、真剣に、これをしないでください!私が作業しなければならないコードベースでこれに出くわしたら、このコードを書いた人に嫌われていると感じるでしょう。
リフレクションを使用しないとできません。メソッドは Date API の一部ではなくdate
、コンパイラに関する限り日付のみです。
使用できる唯一の方法someMethod
は、新しく作成されたインスタンスで直接呼び出すことです。
new Date() { public void someMethod() { } }.someMethod();
いいえ、それがメソッドローカルクラスの目的です。
class MyDate extends Date() {
public void someMethod() {...}
}
MyDate date = new MyDate();
date.someMethod();
I don't know why you would do this, but as written it is not possible, because Date
does not declare someMethod
.
However you can declare a local class inside the method, e.g:
void foo ( )
{
class MyDate extends Date
{
public void someMethod( );
}
MyDate date = new MyDate( );
date.someMethod( );
}
Once again, I would suggest using a normal
class first, because local classes, by their nature, cannot be tested.