近期迁移一些同事写的java代码,其中有一些很好的实践,所用到的技术记录下来,以便日后使用。
1. 表达式的解析,日常用到的表达式都是中缀表达式,而程序语言能识别的是前缀或后缀表达式,对于表达式的转换就需要运用一些方法。具体的文章在这里 查到,讲的很详细。重要的算法摘抄下来,以防文章被删除。
由中缀表达式转为前缀表达式的步骤
1. 初始化两个栈:运算符栈S1和储存中间结果的栈S2;
2. 从右至左扫描中缀表达式;
3. 遇到操作数时,将其压入S2;
4. 遇到运算符时,比较其与S1栈顶运算符的优先级:
5. 遇到括号时:
- 如果S1为空,或栈顶运算符为右括号“)”,则直接将此运算符入栈;
- 否则,若优先级比栈顶运算符的较高或相等,也将运算符压入S1;
- 否则,将S1栈顶的运算符弹出并压入到S2中,再与S1中新的栈顶运算符相比较;
6. 重复步骤2至5,直到表达式的最左边;
- 如果是右括号“)”,则直接压入S1;
- 如果是左括号“(”,则依次弹出S1栈顶的运算符,并压入S2,直到遇到右括号为止,此时将这一对括号 丢弃;
7. 将S1中剩余的运算符依次弹出并压入S2;
8. 依次弹出S2中的元素并输出,结果即为中缀表达式对应的前缀表达式。2.对于java的enum的运用,通常我们使用final static来定义常量,但有如下的缺点:
使用的时候,你可以在程序中直接引用这些常量。但是,这种方式还是存在着一些问题。
- 类型不安全
- 没有命名空间
- 一致性差
因为整形枚举属于编译期常量,所以编译过程完成后,所有客户端和服务器端引用的地方,会直接将整数值写入。这样,当你修改旧的枚举整数值后或者增加新的枚举值后,所有引用地方代码都需要重新编译,否则运行时刻就会出现错误。
Java 语言规范赋予枚举类型的功能非常的强大,它不仅是简单地将整形数值转换成对象,而是将枚举类型定义转变成一个完整功能的类定义。这种类型定义的扩展允许开发者给枚举类型增加任何方法和属性,也可以实现任意的接口。另外,Java 平台也为 Enum 类型提供了高质量的实现,比如默认实现 Comparable 和 Serializable 接口,让开发者一般情况下不用关心这些细节。
- 类型无指意性
文章地址在这里
3. java 的annotation,点击打开链接
import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface SecondAnnotation { // 注释中含有两个参数 String name() default "Hrmzone"; String url() default "hrmzone.cn"; }
使用类@SecondAnnotation(name="desktophrm",url="desktophrm.com") public String getDefine() { return "get define Annotation"; }
测试类SecondAnnotation anno = m.getAnnotation(SecondAnnotation.class);
4. java的泛型,点击打开链接
泛型类与一般的Java类基本相同,只是在类和接口定义上多出来了用<>声明的类型参数。一个类可以有多个类型参数,如 MyClass<X, Y, Z>。 每个类型参数在声明的时候可以指定上界。所声明的类型参数在Java类中可以像一般的类型一样作为方法的参数和返回值,或是作为域和局部变量的类型。但是由于类型擦除机制,类型参数并不能用来创建对象或是作为静态变量的类型。
最佳实践
在使用泛型的时候可以遵循一些基本的原则,从而避免一些常见的问题。
- 在代码中避免泛型类和原始类型的混用。比如List<String>和List不应该共同使用。这样会产生一些编译器警告和潜在的运行时异常。当需要利用JDK 5之前开发的遗留代码,而不得不这么做时,也尽可能的隔离相关的代码。
- 在使用带通配符的泛型类的时候,需要明确通配符所代表的一组类型的概念。由于具体的类型是未知的,很多操作是不允许的。
- 泛型类最好不要同数组一块使用。你只能创建new List<?>[10]这样的数组,无法创建new List<String>[10]这样的。这限制了数组的使用能力,而且会带来很多费解的问题。因此,当需要类似数组的功能时候,使用集合类即可。
- 不要忽视编译器给出的警告信息。