【发布时间】:2011-01-14 03:47:10
【问题描述】:
我遇到了另一个关于 Java 的“哲学”问题。这是关于以下场景:
您有一个T 类,它定义了一个接口L,该接口将用作侦听器,第二个类的通知器。
现在你有了第二个类(在下面的代码中它们是A 和B 类)。该类将创建T 类的新对象并使用L,后者将使用该对象与第一个进行通信。
所以我提出了 4 个不同版本的监听器对象如何传递给T:
-
A类定义了L的实现,LL类并使用它的新对象创建T类。-
A1预分配对象 -
A2现场创建新对象
-
-
类
B通过使用L的匿名类使用内联方式创建对象(感谢Tim Bender的更正)-
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);
}
}
A 类
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在二进制文件方面并没有什么不同,这只是程序员的选择
标签: java class implementation listener