我遇到了以下代码并且有点困惑。
LocalConfig conf = new LocalConfig() {
@Override
public AppConfigurationEntry[] getAppConfigurationEntry(String name) {
return new AppConfigurationEntry[] {
new AppConfigurationEntry(moduleName(),
AppConfigurationEntry.LoginModuleControlFlag.REQUIRED,
put("principal", RPCConstants.DOMAINUSER).
put("useTicketCache","true").
build())
};
}
};
LocalConfig conf = new LocalConfig()
之后有一个没有分号的代码块。由于LocalConfig
调用new
,我不确定LocalConfig
之后这个块是怎么回事由编译器处理。欣赏见解。
答案 0 :(得分:2)
这是一个匿名课程。 LocalConfig
可能是需要public AppConfigurationEntry[] getAppConfigurationEntry(String name)
实现的接口。这只是创建界面的临时实现的简便方法。通常的方法是创建一个驻留在自己的.java
文件中的具体实现。
在这里,您提供了一个临时实现,然后将其分配给变量conf
。
例如,假设您有一个界面:
public interface MyInterface {
int foo(String bar);
}
通常你会创建一个实现(特别是如果你希望这个具体的实现有很多逻辑并重新使用):
public class MyInterfaceImplementation implements MyInterface {
@Override
public int foo(String bar) {
...
return someIntVar;
}
}
然后您将使用MyInterface myInterface = new MyInterfaceImplementation();
对其进行实例化。您可以创建这样的临时实现,而不是这样做:
MyInterface myInterface = new MyInterface() {
@Override
public int foo(String bar) {
...
return someIntVar;
}
}
有些人避免使用所有和任何匿名类。我认为这取决于用户案例。如果接口很简单(如事件处理程序)并且不太可能被重用,那么我认为内部类很好。
答案 1 :(得分:1)
它是和匿名类,因为LocalConfig是接口,需要它的实现。 所以当你实例化时,你应该有一个实现,但是你没有它,你就可以动态创建。
当您不想创建可重用的自己的实现时,您可以使用此方法,只需覆盖特定的案例或解决方案。这在GUI方法中非常有用
答案 2 :(得分:1)
它被称为匿名类 - 您“动态”实例化一个不存在的类的对象,而不将其作为一个类持久化,并且能够在现场覆盖/实现抽象方法。
答案 3 :(得分:1)
这是一个匿名类。它定义了一个扩展/实现LocalConfig
而没有给它命名的类,实例化该类并将其赋值给一个名为conf
的变量。
答案 4 :(得分:1)
如果你只需要一次特定的子类类,你就可以动态地覆盖类(或实现接口)。这就是代码的作用:它创建了LocalConfig
的新实例,但对其进行了扩展(在这种情况下,覆盖了getAppCOnfigurationEntry()
。