近期读到的java代码总结

来源:互联网 发布:央视官网mac版 编辑:程序博客网 时间:2024/06/08 04:29

     近期迁移一些同事写的java代码,其中有一些很好的实践,所用到的技术记录下来,以便日后使用。

     1. 表达式的解析,日常用到的表达式都是中缀表达式,而程序语言能识别的是前缀或后缀表达式,对于表达式的转换就需要运用一些方法。具体的文章在这里 查到,讲的很详细。重要的算法摘抄下来,以防文章被删除。

由中缀表达式转为前缀表达式的步骤

1. 初始化两个栈:运算符栈S1和储存中间结果的栈S2;
2. 从右至左扫描中缀表达式;
3. 遇到操作数时,将其压入S2;
4. 遇到运算符时,比较其与S1栈顶运算符的优先级:
  • 如果S1为空,或栈顶运算符为右括号“)”,则直接将此运算符入栈;
  • 否则,若优先级比栈顶运算符的较高或相等,也将运算符压入S1;
  • 否则,将S1栈顶的运算符弹出并压入到S2中,再与S1中新的栈顶运算符相比较;
5. 遇到括号时:
  •   如果是右括号“)”,则直接压入S1;
  •  如果是左括号“(”,则依次弹出S1栈顶的运算符,并压入S2,直到遇到右括号为止,此时将这一对括号 丢弃;
6. 重复步骤2至5,直到表达式的最左边;
7. 将S1中剩余的运算符依次弹出并压入S2;
8. 依次弹出S2中的元素并输出,结果即为中缀表达式对应的前缀表达式。

2.对于java的enum的运用,通常我们使用final static来定义常量,但有如下的缺点:

使用的时候,你可以在程序中直接引用这些常量。但是,这种方式还是存在着一些问题。

  1. 类型不安全
  1. 没有命名空间
  1. 一致性差

因为整形枚举属于编译期常量,所以编译过程完成后,所有客户端和服务器端引用的地方,会直接将整数值写入。这样,当你修改旧的枚举整数值后或者增加新的枚举值后,所有引用地方代码都需要重新编译,否则运行时刻就会出现错误。

  1. 类型无指意性
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]这样的。这限制了数组的使用能力,而且会带来很多费解的问题。因此,当需要类似数组的功能时候,使用集合类即可。
  • 不要忽视编译器给出的警告信息。

原创粉丝点击