语言之美系列一 - Java篇

简介:      受七周七语言、编程语言实现模式等读物启发,计划写一个语言之美系列博文,因为最近工作上用的比较多的语言是Java,所以先从它开刀,希望大家多提宝贵意见~ 一. 泛型 (1). 泛型类并没有自己独有的Class类对象; (2). 静态变量是被泛型类的所有实例所共享的; (3). 泛型的类型参数不能用在Java异常处理的catch语句中; (4). List<? ext

     受七周七语言、编程语言实现模式等读物启发,计划写一个语言之美系列博文,因为最近工作上用的比较多的语言是Java,所以先从它开刀,希望大家多提宝贵意见~

一. 泛型
(1). 泛型类并没有自己独有的Class类对象;
(2). 静态变量是被泛型类的所有实例所共享的;
(3). 泛型的类型参数不能用在Java异常处理的catch语句中;
(4). List<? extends Number>说明List中可能包含的元素类型是Number及其子类。而List<? super Number>则说明List中包含的是Number及其父类;
(5). 泛型继承体系:
a.相同类型参数的泛型类的关系取决于泛型类自身的继承体系结构。即List<String>是Collection<String>的子类型,List<String>可以替换Collection<String>。这种情况也适用于带有上下界的类型声明。
b.当泛型类的类型声明中使用了通配符的时候,其子类型可以在两个维度上分别展开。如对Collection<? extends Number>来说,其子类型可以在Collection这个维度上展开,即List<? extends Number>和Set<? extends Number>等;也可以在Number这个层次上展开,即Collection<Double>和 Collection<Integer>等。如此循环下去,ArrayList<Long>和 HashSet<Double>等也都算是Collection<? extends Number>的子类型。
c.如果泛型类中包含多个类型参数,则对于每个类型参数分别应用上面的规则。
(6). 在使用带通配符的泛型类的时候,需要明确通配符所代表的一组类型的概念。由于具体的类型是未知的,很多操作是不允许的。
(7). 泛型类最好不要同数组一块使用。你只能创建new List<?>[10]这样的数组,无法创建new List<String>[10]这样的。这限制了数组的使用能力,而且会带来很多费解的问题。因此,当需要类似数组的功能时候,使用集合类即可。
二. 序列化
(1). 如何有选择的进行对象图的序列化,Transient? serialPersistentFields?
(2). 安全性问题? 从不同的层次来加强序列化的安全性。
Ⅰ.对序列化之后的流进行加密。这可以通过CipherOutputStream来实现。
Ⅱ.实现自己的writeObject和readObject方法,在调用defaultWriteObject之前,先对要序列化的域的值进行加密处理。
Ⅲ.使用一个SignedObject或SealedObject来封装当前对象,用SignedObject或SealedObject进行序列化。
Ⅳ.在从流中进行反序列化的时候,可以通过ObjectInputStream的registerValidation方法添加ObjectInputValidation接口的实现,用来验证反序列化之后得到的对象是否合法。
三. Proxy

       动态生成的代理类有如下一些特点:

(1). 包:如果所代理的接口都是 public 的,那么它将被定义在顶层包(即包路径为空),如果所代理的接口中有非 public 的接口(因为接口不能被定义为 protect 或 private,所以除 public 之外就是默认的 package 访问级别),那么它将被定义在该接口所在包,这样设计的目的是为了最大程度的保证动态代理类不会因为包管理的问题而无法被成功定义并访问;

(2). 类修饰符:该代理类具有 final 和 public 修饰符,意味着它可以被所有的类访问,但是不能被再度继承;

(3). 类名:格式是“$ProxyN”,其中 N 是一个逐一递增的阿拉伯数字,代表 Proxy 类第 N 次生成的动态代理类,值得注意的一点是,并不是每次调用 Proxy 的静态方法创建动态代理类都会使得 N 值增加,原因是如果对同一组接口(包括接口排列的顺序相同)试图重复创建动态代理类,它会很聪明地返回先前已经创建好的代理类的类对象,而不会再尝试去创建一个全新的代理类,这样可以节省不必要的代码重复生成,提高了代理类的创建效率.

      由此可见,受限于 Java 的语言的类继承机制,动态代理机制也有其局限,如它不能支持:
(1). 声明为 final 的类;
(2). 声明为 final 的函数;
(3). 构造函数均为 private 类型的类。

     要是我非要代理这些类呢? 别急,后面会有字节码操作大餐。。。

参考文献:
1. http://download.oracle.com/javase/6/docs/platform/serialization/spec/serialTOC.html
2. http://download.oracle.com/javase/6/docs/platform/rmi/spec/rmiTOC.html
3. http://tutorials.jenkov.com/java-exception-handling/index.html

目录
相关文章
|
27天前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
62 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
3月前
|
Java Maven
使用java语言制作一个窗体(弹窗),用来收集用户输入的内容
该博客文章介绍了如何使用Java Swing中的JFrame创建一个窗体来收集用户输入的内容,并提供了详细的实现步骤和完整代码示例。
使用java语言制作一个窗体(弹窗),用来收集用户输入的内容
|
2天前
|
SQL 安全 Java
安全问题已经成为软件开发中不可忽视的重要议题。对于使用Java语言开发的应用程序来说,安全性更是至关重要
在当今网络环境下,Java应用的安全性至关重要。本文深入探讨了Java安全编程的最佳实践,包括代码审查、输入验证、输出编码、访问控制和加密技术等,帮助开发者构建安全可靠的应用。通过掌握相关技术和工具,开发者可以有效防范安全威胁,确保应用的安全性。
12 4
|
23天前
|
Java 程序员 编译器
在Java编程中,保留字(如class、int、for等)是具有特定语法意义的预定义词汇,被语言本身占用,不能用作变量名、方法名或类名。
在Java编程中,保留字(如class、int、for等)是具有特定语法意义的预定义词汇,被语言本身占用,不能用作变量名、方法名或类名。本文通过示例详细解析了保留字的定义、作用及与自定义标识符的区别,帮助开发者避免因误用保留字而导致的编译错误,确保代码的正确性和可读性。
41 3
|
26天前
|
移动开发 Java 大数据
深入探索Java语言的核心优势与现代应用实践
【10月更文挑战第10天】深入探索Java语言的核心优势与现代应用实践
41 4
|
1月前
|
存储 Java 数据安全/隐私保护
Java中的域,什么是域?计算机语言中的域是什么?(有代码实例)
文章解释了Java中域的概念,包括实例域、静态域、常量域和局部域,以及它们的特点和使用场景。
48 2
|
1月前
|
Java 数据安全/隐私保护 C++
Java语言关键字
Java语言关键字
19 2
|
1月前
|
分布式计算 安全 Java
Java语言的特点?
Java语言的特点?
|
4月前
|
算法 Java
Java语言实现最短路径算法(Shortest Path)
Java语言实现最短路径算法(Shortest Path)
58 3
|
3月前
|
Rust JavaScript Java
简单对比Java、Python、Go、Rust等常见语言计算斐波拉契数的性能
简单对比Java、Python、Go、Rust等常见语言计算斐波拉契数的性能
下一篇
无影云桌面