这个java代码是什么意思

时间:2014-02-21 18:16:26

标签: java syntax

我遇到了以下代码并且有点困惑。

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之后这个块是怎么回事由编译器处理。欣赏见解。

5 个答案:

答案 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()