2014-02-21 69 views
2

我遇到下面的代码,有点困惑。这个java代码是什么意思

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()后一个代码块没有分号。由于LocalConfignew调用,我不知道如何LocalConfig后此步骤由编译器处理。欣赏见解。

+0

这是一个匿名内部类。它是实现或扩展LocalConfig的类,但新类本身没有名称。 –

+0

嗯.6分钟内回答不到一分钟?所有似乎都(至少差不多)是正确的?) –

回答

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

它是匿名类,因为LocalConfig是接口,需要实现它。 因此,当你实例化你应该有一个实现,但你没有它你在飞行中创建。

当你不想创建一个可重用的自己的实现,只是覆盖特定的案例或解决方案时,您可以使用这种方法。这在GUI方法中也非常有用

1

它被称为匿名类 - 您可以实时“实时”实例化不存在的类的对象,而不会将其作为类继续存在,并且可以覆盖/实现点。

1

这是一个匿名类。它定义了一个类,它扩展/实现了LocalConfig而不给它起一个名字,实例化这个类并将它分配给一个名为conf的变量。

1

如果您只需要一次特定的子类,YOu就可以重载类(或实现接口)。这是代码的作用:它创建一个新的实例LocalConfig,但扩展它(在这种情况下,覆盖getAppCOnfigurationEntry()