Tag: 匿名类

为什么不在java中的匿名类中使用构造函数?它与OOP的规则相矛盾

oops规则是“没有构造函数就没有类可以存在”。没关系。但是在java中,匿名类只能有它的构造函数。因为它没有任何名称。 所以它与OOPS规则相矛盾。我真的很困惑。它是否打破了OOPS规则?请帮忙

在java中编写自定义语法解释器?

我即将开始编写一个演示程序来编写我即将给出的演讲。 我想让class上的每个学生都下载这个应用程序,然后能够通过命令行以交互方式创建对象实例(及其图形表示)。 我决定用java编写,不是因为它是我最熟悉的语言,而是因为它有简单的图形类,我可以非常肯定jar会在他们的计算机上运行。 简介。 现在的问题是: 为此程序实现某些自定义命令行语法的好方法是什么? 我想使用一个简单,随意的语法,如: CREATE Monster Bob; Bob.jump(); LS Bob //to list Bob’s methods or something. LS CREATE //to list all the classes 首先,当我想到这个问题时,我会首先想到的是什么。 我可以想象我可以在树型链接中拥有一组地图。 我可以解析每个关键词作为下一个地图的关键。 因此,“CREATE Monster Bob”可以被评估为 1)搜索关键字“CREATE”的关键字映射。 返回值,该值是对类映射的引用。 2)搜索类映射关键“怪物”。 返回值,这是一个实现一些接口Leaf的工厂类,它让我知道它是一个叶子值(我将使用instanceof进行检查)。 3)也许Leaf接口将包含一个名为execute()的方法,它可以做任何想做的事情。 在这种情况下,它将创建一个Monster对象,将此对象添加到名为Objects的名为Bob的地图中。 (这个Leaf业务听起来很难看,但可以清理。) 凉。 但这句话对我来说有点困难:Bob.jump(); 1)在“Bob”中搜索一些对象图。 返回一些使用类似“evaluate(String s)”的方法实现接口的对象,并将其传递给字符串“jump()” 2)Bob搜索方法的某些内部地图“jump()”,然后……? 在c ++中,我将把键作为指向将被执行的成员函数Monster.jump()的指针。 但是我不相信java中没有函数指针这样的东西。 我已经读过你可以使用匿名类来完成这个,虽然我没有尝试过。 看起来它会起作用。 所以,这会有效,但有更优雅的方式去做吗? 我以前从未写过任何类型的翻译。 如果有人提供一些提示,我想以一种很好的方式做一些事情并在这个过程中学到一些东西。 如果我不是很结构化,这似乎是一种可能容易出错的方法,特别是当Bob和其他所有对象开始解析自己的指令和使用匿名函数时。 此外,看起来除了普通代码之外,每个类都需要一个运行时就绪的接口。 […]

封闭对象的引用通过匿名类java转义

我在实践中阅读Java并发性,下面的例子来自于此。 我的问题是这个参考逃脱是什么意思? 会有什么问题? 。 该引用如何从doSomething(e)中逃脱。 public class ThisEscape { public ThisEscape(EventSource source) { source.registerListener( new EventListener() { public void onEvent(Event e) { doSomething(e); } } ); } } 这是如何解决这个问题的 public class SafeListener { private final EventListener listener; private SafeListener() { listener = new EventListener() { public void onEvent(Event e) { doSomething(e); } }; } public […]

内/匿名课程的最佳实践

匿名类和静态内部类的最佳实践(设计和性能)是什么? 我个人认为静态内部类提供了更好的封装,并且应该提供更好的性能,因为他们无法访问类外的最终变量。 但我从来没有真正质疑这一点。 我发现了一篇关于此的post,但我觉得它实际上并没有回答这个问题,只是人们对此的个人想法。

是否可以在没有外部类的情况下序列化匿名类?

我在网上进行了一项小型研究并审查了该网站上的相关主题,但答案是矛盾的:有些人说这是不可能的,有些人说这是可能的,但很危险。 目标是将匿名类的对象作为RMI方法的参数传递。 由于RMI要求,此类必须是可序列化的。 这没问题,很容易使类Serializable。 但我们知道内部类的实例包含对外部类的引用(而匿名类是内部类)。 因此,当我们序列化内部类的实例时,外部类的实例被序列化以及字段。 这里是问题出现的地方:外部类不可序列化,更重要的是 – 我不想序列化它。 我想要做的只是发送匿名类的实例。 简单示例 – 这是一个RMI服务,其方法接受Runnable: public interface RPCService { Object call(SerializableRunnable runnable); } 以下是我想要调用该方法的方法 void call() { myRpcService.call(new SerializableRunnable() { @Override public Object run { System.out.println(“It worked!”); } } } 正如您所看到的,我想要做的是向另一方发送“操作” – 系统A描述应该在系统B上运行的代码。这就像用Java发送脚本一样。 如果可能的话,我可以很容易地看到一些危险的后果:例如,如果我们从Runnable访问字段或捕获外部类的最终变量 – 我们将遇到麻烦,因为调用者实例不存在。 另一方面,如果我在Runnable中使用安全代码(编译器可以检查它),那么我没有看到禁止此操作的原因。 因此,如果有人知道,如何在匿名类中正确覆盖writeObject()和readObject()方法或如何引用外部类transient或解释为什么在java中不可能,它将非常有用。 UPD另一个需要考虑的重要事项:外部类不存在于将执行该方法的环境中(系统B),这就是为什么应该完全排除有关它的信息以避免NoClassDefFoundError 。

Java是否“缓存”匿名类?

请考虑以下代码: for(int i = 0;i < 200;i++) { ArrayList currentList = new ArrayList() {{ add(i); }}; // do something with currentList } Java如何处理currentList的类? 它是否会认为200个对象中的每一个都是不同的类? 即使在创建第一个对象后,它是否会受到性能影响? 是以某种方式缓存吗? 我只是好奇 :)

抽象类和匿名类

abstract class Two { Two() { System.out.println(“Two()”); } Two(String s) { System.out.println(“Two(String”); } abstract int display(); } class One { public Two two(String s) { return new Two() { public int display() { System.out.println(“display()”); return 1; } }; } } class Ajay { public static void main(String …strings ){ One one=new One(); Two two=one.two(“ajay”); System.out.println(two.display()); […]

是否可以在使用reflection时创建匿名类?

我希望能够在对象运行初始化程序之前在运行时实现一个方法。 这将允许我设置初始化期间使用的字段。 这是一个例子: class A { public A() { initialize(); } public void initialize() { } } class B extends A { public String message; { System.out.println(message); } } public class MainClass { public static void main(final String[] args) throws Exception { Class aClass = (Class)Class.forName(args[0]); // what’s next in order to something like this […]

动态构建匿名类混淆

我正在尝试使用reflection来创建匿名类的实例。 但偶尔我会在即时通讯中看到奇怪的行为。 请查看这些类似的代码片段 public class HideAndSeek { @SuppressWarnings(“unchecked”) public static void main(String[] args) throws IllegalAccessException, InstantiationException{ final String finalString = “I’m final :)”; Object object2 = new Object(){ { System.out.println(“Instance initializing block”); System.out.println(finalString); } private void hiddenMethod() { System.out.println(“Use reflection to find me :)”); } }; Object tmp = object2.getClass().newInstance(); } } 此代码运行良好,并且预期输出 Instance initializing […]

从匿名类调用新定义的方法

我实例化了一个匿名类的对象,我添加了一个新方法。 Date date = new Date() { public void someMethod() {} } 我想知道是否有可能从外部调用此方法,类似于: date.someMethod();