在Java中,匿名类(Anonymous inner classes)多用来处理事件(event handle)。但其实,它们对于debug也很有帮助。本文将介绍如何利用匿名类来简化你的debug。
我们该如何调试那些非自己源码的方法调用呢?比方说,对Jbutton.setEnable()的调用。Java提供的匿名类,可以很好的解决这个问题。
public class MyButton extends JButton
通常,当我们继承一个类时,我们可以通过提供新的方法来覆盖(override)该类中现有的方法:
{
public void setVisible( boolean visible )
{
// Rolling our own visibility
}
}
在实例化(instantiate)MyButton类之后,任何对方法setVisible()的调用,都会调用上面代码中的setVisible()方法。可问题是,我们不想仅仅为了覆盖一个方法而继承整个类,尤其是所需的实例(instantiation)很有限的时候。匿名类使得我们能在实例化的同时覆盖方法。
如果我们只想在某个JButton对象中加入我们自己的可视逻辑,那么我们可以在申明这个button对象的同时重写这个方法:
这段代码都做了什么?花括号({})中间的代码申明了setVisible()方法,并覆盖了JButton类中的那个,但这仅限于myButton对象。我们没有改变JButton类,也没有申明一个新类,我们仅给了一个特殊的JButton对象它自己的可视逻辑。
JButton myButton = new JButton()
{
public void setVisible( boolean visible )
{
// Rolling our own visibility
}
};
在面向对象术语中,myButton是一个从JButton类继承而来的无名,也就是匿名,类的对象。
这种创建匿名类并同时覆盖方法的技术用在什么时候?假设你在编写一段Swing程序,在你向一个GUI物件(element)中添加一个event listener(假设叫作ActionListener)之前,你已经编写了一段这种机制的代码。现在,我们假设我们有个庞大的类,里面有很多按钮,但是有一个按钮时隐时现,你想知道为什么会出这样的异常情况,利用上面的代码并在setVisible()方法上设置断点。然后,当你运行你的程序时,你设置的断点就会在恰当的地方暂停程序。检查栈轨迹(stack trace),我们会发现没有按所预期的那样来调用setVisible()方法的原因并修复这个它。
匿名类在debug类似这种源码不可得的类的时候很有用。即便在源码可得的情况下,在大量使用的方法(如setVisible)上设置断点,也是件很麻烦的事情,因为我们在每个实现了setVisible()方法的类的对象上都要转入断点。而匿名类可针对某个特定的对象进行“外科手术”式的debug。
分享到:
相关推荐
另一个重大改进是方法引用来替代传统的匿名内部类,这减少了代码的复杂性。 JavaFX是Java的图形用户界面(GUI)工具包,它为开发桌面、Web和移动应用提供了一个现代且丰富的框架。Java 8中的JavaFX支持2D和3D图形,...
1. **匿名类**:Java 8之前,如果需要创建一个只用一次的类,通常会使用匿名类。在反编译时,匿名类的表示方式不同于普通类,因为它没有名称。Luyten能识别并重构出这些匿名类的源代码,使得用户可以阅读和理解其...
- **方法引用来替代匿名内部类**:允许直接引用类或接口的方法,减少了代码量。 - **Stream API**:提供了一种新的处理数据的方式,便于集合操作和并行处理。 - **Date和Time API**:全新的java.time包提供了更...
Lambda表达式可以被用来代替具有单个抽象方法的接口的匿名类实例,简化了代码并减少了冗余。例如,你可以使用Lambda来创建Runnable或者Comparator对象,这在处理集合时特别有用。 其次,流(Stream) API是Java 8中的...
API 文档展示了如何使用匿名内部类来简化代码,例如在事件处理中。 5. **动态代理(Dynamic Proxies)**:Java 提供了 `java.lang.reflect.Proxy` 类,可以创建动态代理类,实现运行时的接口实现。这对于实现 AOP...
内部类包括成员内部类、局部内部类、匿名内部类,它们可以访问外部类的私有成员。 【泛型与注解】 泛型提供类型安全,允许在编译时检查类型。注解提供元数据,可以被编译器或运行时系统用来处理程序。 【多线程】...
8. 内部类:Java 6支持内部类,包括成员内部类、局部内部类和匿名内部类。它们可以提供更灵活的代码组织和封装,尤其是在处理事件驱动编程和回调时。 9. 泛型:Java 5引入泛型,Java 6继续改进。泛型增强了类型安全...
Lambda表达式允许你用一种简洁的方式定义匿名函数,可以作为方法参数,或者存储在变量中。 2. **函数式接口**:为了支持lambda表达式,Java8引入了函数式接口的概念。这些接口只有一个抽象方法,比如`java.util....
8. **类型推断**:Java 7引入了钻石操作符(),简化了匿名内部类和泛型实例化时的类型声明。 9. **编译器优化**:Java 7的JIT(Just-In-Time)编译器进一步优化,能够更智能地识别并编译热点代码,提升运行时性能...
6. **新的日期和时间API**:Java 8用java.time包替换了旧的java.util.Date和java.util.Calendar,提供了更直观、更易于使用的日期和时间处理功能,如LocalDate、LocalTime、LocalDateTime等类。 7. **方法引用来...
总结来说,Java JDK 1.7.0_80是一个重要的开发工具,提供了丰富的功能和改进,使得Java开发者能高效地工作并保证应用的安全性。通过理解和掌握这个版本的特点和配置,开发者可以更好地利用Java进行软件开发。
12. **Lambda表达式**:Java 8引入的新特性,简化了函数式编程,可以更简洁地编写匿名函数。 13. **接口和默认方法**:Java 8开始,接口可以包含默认方法和静态方法,增强了接口的灵活性。 14. **注解(Annotation...
3. **Lambda表达式**:Lambda表达式是Java 8中的一个核心特性,它提供了一种简洁的方式来表示匿名函数,简化了处理函数接口和回调函数的代码。 4. **方法引用**:方法引用允许直接引用已有方法,而不是通过lambda...
Java Development Kit (JDK) 是Java编程语言的核心组件,包含了Java运行时环境(JRE)以及一系列用于开发和调试Java应用的工具。JDK8是Oracle公司发布的Java平台标准版(Java SE)的一个重要版本,引入了许多新特性...
3. **钻石操作符**:在创建匿名类实例时简化了语法,不再需要显式指定类型参数。 4. **Strings in Switch**:在switch语句中可以直接使用String对象,增强了代码的可读性。 5. **Improved Type Inference for ...
4. **Date和Time API**:Java 8对日期和时间API进行了全面更新,引入了`java.time`包,包含了`LocalDate`、`LocalTime`、`LocalDateTime`和`ZonedDateTime`等类,提供了更强大且易于使用的日期和时间操作功能。...
这个版本在Java社区中广为使用,尤其对于许多Web项目来说,它是必要的运行环境。 在Windows系统中,安装JDK1.8是运行Java程序的第一步。JDK1.8提供了对Java 8特性的支持,例如Lambda表达式、Stream API、新的日期和...
- 最终类、静态类、匿名类、内部类等特殊类的使用场景。 - 异常处理机制及编码规范的重要性。 - **Java核心编程** - 输入/输出流、多线程、实体类、集合类等基础知识。 - 正则表达式、XML和属性文件等数据处理...
Java JDK是Java开发的基础,包含了Java编译器(javac)、Java运行时环境(JRE)、Java文档生成器(javadoc)、Java调试器(jdb)以及各种工具和库,如jar打包工具、native libraries等,用于Java应用程序的开发和...
Java 5.0之前,开发者通常使用常量类来实现枚举功能,但这种方式存在很多问题。JDK1.5引入了枚举类型,使得枚举更安全、易用。枚举可以拥有方法和字段,还可以实现接口,提高了代码的结构化和可维护性。 三、变量...