3 回答
TA贡献1803条经验 获得超6个赞
这称为本地课程。
2很简单:是的,将生成一个类文件。
1和3是同一个问题。您可以使用本地类,而无需使用一种方法来实例化一个本地类,也无需在任何地方知道实现细节。
典型的用途是创建某些接口的一次性实现。例如,您经常会看到以下内容:
//within some method
taskExecutor.execute( new Runnable() {
public void run() {
classWithMethodToFire.doSomething( parameter );
}
});
如果您需要创建一堆这些文件并对其进行处理,则可以将其更改为
//within some method
class myFirstRunnableClass implements Runnable {
public void run() {
classWithMethodToFire.doSomething( parameter );
}
}
class mySecondRunnableClass implements Runnable {
public void run() {
classWithMethodToFire.doSomethingElse( parameter );
}
}
taskExecutor.execute(new myFirstRunnableClass());
taskExecutor.execute(new mySecondRunnableClass());
关于接口:我不确定是否存在使本地定义的接口成为编译器问题的技术问题,但是即使没有,它们也不会增加任何价值。如果在方法之外使用了实现本地接口的本地类,则该接口将毫无意义。如果只在方法内部使用本地类,则接口和类都将在该方法内实现,因此接口定义将是多余的。
TA贡献1860条经验 获得超9个赞
从方法外部无法看到该类(即,实例化了其方法,无需使用Reflection即可访问)。另外,它可以访问在testMethod()中定义的局部变量,但可以在类定义之前。
我实际上以为:“不会写入任何此类文件。” 直到我尝试为止:哦,是的,这样的文件已创建!它将被称为A $ 1B.class之类的东西,其中A是外部类,而B是本地类。
特别是对于回调函数(GUI中的事件处理程序,例如单击Button时的onClick()等),通常使用“匿名类”-首先,因为您可以得到很多匿名类。但是有时候匿名类还不够好-特别是,您不能在它们上定义构造函数。在这些情况下,这些方法局部类可以是一个很好的选择。
TA贡献1815条经验 获得超10个赞
当您希望满足以下条件时,唯一的情况是内部类与匿名类(又名Java闭包)具有完整的功能
您需要提供接口或抽象类实现
您想使用在调用函数中定义的一些最终参数
您需要记录接口调用的执行状态。
例如,有人想要一个,Runnable而您想记录执行开始和结束的时间。
对于匿名类,这是不可能的,对于内部类,您可以做到这一点。
这是一个例子来说明我的观点
private static void testMethod (
final Object param1,
final Object param2
)
{
class RunnableWithStartAndEnd extends Runnable{
Date start;
Date end;
public void run () {
start = new Date( );
try
{
evalParam1( param1 );
evalParam2( param2 );
...
}
finally
{
end = new Date( );
}
}
}
final RunnableWithStartAndEnd runnable = new RunnableWithStartAndEnd( );
final Thread thread = new Thread( runnable );
thread.start( );
thread.join( );
System.out.println( runnable.start );
System.out.println( runnable.end );
}
不过,在使用此模式之前,请评估普通的旧顶级类,内部类或静态内部类是否是更好的选择。
添加回答
举报