在使用了一段时间后,我不禁觉得使用匿名类时被迫跳过的圈套是不值得的。你最终得到的是final,无论代码是什么,都比使用命名良好的内部类更难阅读。那么使用它们有什么好处呢?我一定是遗漏了什么。 最佳答案 优点是它是闭包的实现。它很笨重,但它是我们目前Java中最好的。换句话说,您不必为了保留一些您已经在某处作为局部变量获得的状态而创建新类。我有anarticlecomparingC#andJavaclosures,以及为什么它们首先有用,这可能会有所帮助。 关于java-匿名类(class
C#中是否有类似匿名内部类(在Java中使用)之类的东西?我将通过示例解释我将使用它做什么:我正在声明和初始化IDictionary类型的字段我需要编写自定义IEqualityComparer.那是因为我希望当两个人具有相同的名称和ID(不仅仅是默认的ID)时,IDictionary将他们视为平等。我不需要这个IEqualityComparer代码中的其他任何地方。所以我必须声明实现IEqualityComparer的新类去做这个?在Java中,我会使用匿名类,像这样(这是混合的C#-Java语法,只是为了显示我正在寻找的功能):IDictionrymyDict=newDictiona
我知道,除了使用匿名类方法,我们不能在java中实例化接口(interface)或抽象类,但它背后的原因是什么? 最佳答案 您不能实例化接口(interface)或抽象类,因为它会违背面向对象的模型。接口(interface)代表契约-接口(interface)的实现者将能够做所有这些事情,履行契约的promise。抽象类是一个类似的想法,因为它们代表一个未履行的契约(Contract),一个能够做事的promise,除了与接口(interface)不同的是,它们定义了一些功能或字段,但需要在使用前填写。简单地说,在一个好的面向对象
下面的java代码工作正常。publicstaticvoidmain(String[]arg){JPanelp=(newJPanel());p.add(newObject(){JButtonf(JButtonx){x.setEnabled(false);returnx;}}.f(newJButton("B")));JFramew=newJFrame("W");w.add(p);w.pack();w.setVisible(true);}如果将方法更改为其通用形式,程序将失败。publicstaticvoidmain(String[]arg){JPanelp=(newJPanel());p
我已经为我的问题创建了一个简短的例子。我正在匿名创建对象列表并将它们添加到ArrayList。一旦项目在ArrayList中,我稍后返回并向列表中的每个对象添加更多信息。如果您不知道其索引,是否可以从列表中提取特定对象?我只知道对象的“名称”,但您不能执行list.get(ObjectName)或任何操作。推荐的处理方法是什么?我不想每次想要检索一个特定对象时都遍历整个列表。publicclassTestCode{publicstaticvoidmain(Stringargs[]){Cavecave=newCave();//LoopaddsseveralPartiestothecave
如果我有一个这样的匿名内部类对象(其中Foo是一个接口(interface)):Foofoo=newFoo(){@OverridepublicStringhello(ObjectdummyArg){return"hello,world.";}};然后我尝试从这样的jsp调用Foo.hello:${foo.hello('blah')}它抛出:javax.el.MethodNotFoundException:Unabletofindmethod[hello]with[1]parameters但是如果没有参数:Barbar=newbar(){@OverridepublicStringhell
在当前的JDK1.8实现中,它构建了一个匿名对象来保存lambda函数并在该对象上调用该函数。这个匿名对象是在每次调用中重复使用,还是每次都重新创建一个对象? 最佳答案 它可能会被重复使用,也可能不会。来自JLS15.27.4:Eitheranewinstanceofaclasswiththepropertiesbelowisallocatedandinitialized,oranexistinginstanceofaclasswiththepropertiesbelowisreferenced.你不能指望它是其中之一。编译器和/或
我今天收到一个代码审查评论,将这个匿名类提取到一个字段中,以避免一遍又一遍地分配它:Collections.transform(newFunction(){Barapply(Foofoo){//dosomesimplelocaltransformoffoointoaBar.}});我回答说“没关系,JVM优化了”。虽然我确实知道这种“优化”不会以任何方式影响性能,而且我认为代码可内联访问的附加值是值得的,但我很好奇我对JVM优化的看法是否正确。所以,我的问题是-提议的重构绝对是空操作,因为JVM无论如何都会对其进行优化,或者这里是否存在一些微小的理论性能增益?
“你为什么要这样做,你有什么问题吗?”尽管如此,有没有办法在不更改final方法参数名称的情况下完成此操作?privateFoocreateAnonymousFoo(finalBarbar){returnnewFoo(){privateBarbar=SomeUnknownScopeQualifier.bar;publicBargetBar(){returnbar;}publicvoiddoSomethingThatReassignsBar(){bar=bar.createSomeDerivedInstanceOfBar();}};}显然,如果没有doSomethingThatReass
当使用匿名内部类作为PropertyChangeListener时,类垃圾在对象生命周期的哪个阶段被收集?在回收包含类(SettingsNode)之后?我是否应该在包含类(SettingsNode)的终结器中显式删除PropertyChangeListener?publicclassSettingsNodeextendsAbstractNode{publicSettingsNode(Projectproject,ProjectSettingsprojectSettings)throwsIntrospectionException{//useananonymousinnerclassto