JUC Unsafe

Unsafe位于sun.misc包下,主要提供一些用于执行低级别、不安全操作的方法,如直接访问系统内存资源、自主管理内存资源等,这些方法在提升Java运行效率、增强Java语言底层资源操作能力方面起到了很大的作用。但由于Unsafe类使Java语言拥有了类似C语言指针一样操作内存空间的能力,如果过度或者不正确地使用Unsafe类将会使得增加程序出错的风险,使得Java这种安全的语言变得不再安全,因此使用时需要慎重。

这里并不打算作深入探讨,只是简单列举一些Unsafe中提供的常见api,方便在讨论其它内容时进行引用,对于其提供的api大致则可以按如下分类:

Java 注解

注解为在代码中添加信息提供了一种形式化的方法,使我们可以在稍后某个时刻非常方便的获取和使用这些信息,注解其实可以理解为代码的元数据(元数据是关于数据的数据)。

在注解之前,xml已经被广泛用于元数据,其好处是元数据与代码可以完全解耦。但是随着项目的不断膨胀,xml维护将变得越来越麻烦,因此对于那些并不会发生变化的元数据,使用xml配置只会带来累赘。而注解的方式相当于在代码上添加一些标记,并且可以参与编译以便在运行时能够获取。其好处主要是省去了xml文件的维护,另外使代码更加干净易读,以及提供编译期检查,但是耦合度增加了,即牺牲了xml配置的灵活性。

Java 枚举

枚举enum可以将一组具名的值得有限集合创建为一种新的类型,而这些具名的值可以作为常规的程序组件使用,这是一种非常有用的功能。

Java 泛型

一般的类和方法,只能使用具体的类型,如果要编写可以应用于多种类型的代码,那么这种刻板的限制对代码的限制就会很大。

在面向对象编程语言中,多态算是一种泛化机制。可以将方法的参数类型设为基类,那么该方法就可以接受从这个基类导出的任何类作为参数。但程序还是会受到继承的限制,比如java中就是单继承体系。如果将方法的参数设为一个接口,那么限制会松很多,任何实现了该接口的类都能满足该方法,包括暂时那些还不存在的类。

但有时即便使用了接口,对程序的约束还是太强。因为一旦指明了接口,它就要求你的代码必须使用特定的接口。而我们希望能编写更通用的代码,能够应用于”某种不具体的类型”,而不是一个具体的接口或者类。

泛型实现了”参数化类型”的概念,使代码可以应用于多种类型。其最初的目的是希望类或方法能够具备最广泛的表达能力,通过解耦类或方法与所使用的类型之间的约束。 只是java中的泛型并没有这样高的追求,它的目的只是用来告诉编译器类或方法希望使用的参数类型,以便编译器能够确保编译时参数都是期望的类型。实际上在编译之后参数的类型信息都会被擦除成边界类型,这样保证在运行时不会出现类型错误。

Java Exception

发现错误的理想时机是在编译阶段,即在运行程序之前。然而,编译期间并不能找出所有的错误,有些问题只能在运行期间解决。那么,希望通过某种方式,让错误源能够传递给适当的接收者,该接收者知道如何正确地处理这个问题,java中异常处理的一个重要目标就是把错误处理的代码与错误发生的位置相分离

另外,java的主要目标之一就是创建供他人使用的程序构件,要想创建健壮的系统,其每一个构件都必须是健壮的。可以通过异常建立供统一的错误报告模型,使得构件能够与客户端代码可靠地沟通,最终目的在于通过少数代码来简化大型、可靠程序的生成,并且通过这种方式可以使你更加自信,即程序中没有未处理的错误。