私はJavaに関するもう一つの「哲学的な」質問を受けました。次のシナリオについてです。"Listener"クラスの実装の違いは何ですか?
リスナーとして使用するインターフェイスL
と、2番目のクラスのNotifierのインターフェイスを定義するT
クラスがあります。
これで、次のコードではA
とB
のクラスになりました。そのクラスは、クラスT
の新しいオブジェクトを作成し、L
を使用します。これは後者が最初のオブジェクトと通信するために使用します。 A
がL
の実装、クラスLL
を定義し、作成するために、それの新しいオブジェクトを使用し
クラス:
だから私は、リスナーオブジェクトがT
に渡さすることができますどのようにそれの4つの異なるバージョンを発表しますT
クラス。A1
はA2
が
クラス
B
はL
(感謝ティム・ベンダーの匿名クラスを使用してオブジェクトを作成するインライン方法を使用してその場で新しいオブジェクトを作成し、オブジェクトを事前に割り当て修正のために)B1
オブジェクトを事前に割り当てるB2
は、私の質問があるスポット
に新しいオブジェクトを作成し、これらのバージョンのいずれかが何らかの形で、より効率的でしょうか?何らかの理由で安全なものではありませんか?議論し、他のバージョンを示唆し、説明してください!
クラスT
class T extends TT{
public interface L{
public void do(int i);
}
private L Lo;
T(L i){
Lo = i;
}
public void start(){
// do stuff
L.do(0);
}
}
クラス
class A1{
private class LL implements L{
@Override
public void do(int i){
// do stuff
}
}
private LL l = new LL();
public void function(){
T t = new T(l)
}
}
class A2{
private class LL implements L{
@Override
public void do(int i){
// do stuff
}
}
public void function(){
T t = new T(new LL())
}
}
クラスB
class B1{
private L l = new L(){
@Override
public void do(int i){
// do stuff
}
};
public void function(){
T t = new T(l);
}
}
class B2{
public void function(){
T t = new T(new L(){
@Override
public void do(int i){
// do stuff
}
});
}
}
"クラスBは、インターフェイスLを明示的に実装せずにオブジェクトを作成するインラインの方法を使用します"という記述は間違っています。インタフェースLは明示的に実装されています。説明しようとしていることは、一般的に匿名クラスと呼ばれます。 –
@Tim Bender、訂正ありがとうございました。だから、基本的に 'A'と' B'はバイナリに関して全く違うわけではなく、プログラマの選択になります。 – alkar