[转]Java se 7 最新特性研究(一)

详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp81

 

从2006到现在等待了多年的jdk7终于发布了.这里将对它的一些新特做一些初步的研究:

jdk7 相对于jdk6主要在以一几个方面有了非常显著的改进的提升:

首先分析其对java语言本身的改进:

二进制表示的支持(Binary Literals)的支持。

在JDK7中可以用二进制的形式表示整形数据(byte,short,int,long),这些整形类数据如果用二制表示则需0b或0B打头。如:

byte aByte=(byte)0b01;

short aShort=(short)0B001;

int aInt=0b01001;

long aLong=0B011101L;

使用二进制表示数据有什么好处呢?我们看一下下面的例字。

示例一:

要求定义一个数组。表示按位旋转(即后个数是前一个数向左旋转一位,请注意是旋转)。用二制可以比较清晰地表示这种数据结构:

public static final int[] phases = {
  0b00110001,
  0b01100010,
  0b11000100,
  0b10001001,
  0b00010011,
  0b00100110,
  0b01001100,
  0b10011000
}

大家看了上面的定义可以比较快地理解定义的内容。如果用16进制或8进制那可能就比较难理解了。如下:

public static final int[] phases = {
    0x31, 0x62, 0xC4, 0x89, 0x13, 0x26, 0x4C, 0x98
}

在定义和设计一些模拟器,如微处理器等方面也很有帮助。如下面是定义的一个8位的微处理器的模拟器:

public State decodeInstruction(int instruction, State state) {
  if ((instruction & 0b11100000) == 0b00000000) {
    final int register = instruction & 0b00001111;
    switch (instruction & 0b11110000) {
      case 0b00000000: return state.nop();
      case 0b00010000: return state.copyAccumTo(register);
      case 0b00100000: return state.addToAccum(register);
      case 0b00110000: return state.subFromAccum(register);
      case 0b01000000: return state.multiplyAccumBy(register);
      case 0b01010000: return state.divideAccumBy(register);
      case 0b01100000: return state.setAccumFrom(register);
      case 0b01110000: return state.returnFromCall();
      default: throw new IllegalArgumentException();
    }
  } else {
    final int address = instruction & 0b00011111;
    switch (instruction & 0b11100000) {
      case 0b00100000: return state.jumpTo(address);
      case 0b01000000: return state.jumpIfAccumZeroTo(address);
      case 0b01000000: return state.jumpIfAccumNonzeroTo(address);
      case 0b01100000: return state.setAccumFromMemory(address);
      case 0b10100000: return state.writeAccumToMemory(address);
      case 0b11000000: return state.callTo(address);
      default: throw new IllegalArgumentException();
    }
  }
}

当然你可以很利二进制定义一张图片。如:


public static final short[] HAPPY_FACE = {
   (short)0b0000011111100000;
   (short)0b0000100000010000;
   (short)0b0001000000001000;
   (short)0b0010000000000100;
   (short)0b0100000000000010;
   (short)0b1000011001100001;
   (short)0b1000011001100001;
   (short)0b1000000000000001;
   (short)0b1000000000000001;
   (short)0b1001000000001001;
   (short)0b1000100000010001;
   (short)0b0100011111100010;
   (short)0b0010000000000100;
   (short)0b0001000000001000;
   (short)0b0000100000010000;
   (short)0b0000011111100000;
}

 

总之,JDK7新增的这种整形的表示方对处理二制的数据操作提供了很好的帮助。

 

String 可以作为switch的statement,很多编程人员都遇到过通过一个字符串来决定程序流转的问题,以JDK7以前大家得通过一些特殊的处理才能得以实现。如先通过一个转换器将

字符串转换为数字类型。JDK7就不需要做那些转换可以直接将字符串做条件来使用。如下:

public String getTypeOfDayWithSwitchStatement(String dayOfWeekArg) {
     String typeOfDay;
     switch (dayOfWeekArg) {
         case "Monday":
             typeOfDay = "Start of work week";
             break;
         case "Tuesday":
         case "Wednesday":
         case "Thursday":
             typeOfDay = "Midweek";
             break;
         case "Friday":
             typeOfDay = "End of work week";
             break;
         case "Saturday":
         case "Sunday":
             typeOfDay = "Weekend";
             break;
         default:
             throw new IllegalArgumentException("Invalid day of the week: " + dayOfWeekArg);
     }
     return typeOfDay;
}

是不是觉得上面的代码很简明?

 

今天先研究到这里,明天研究JDK7最新的异常处理处理特性.

posted on 2015-12-14 11:20  grefr  阅读(164)  评论(0编辑  收藏  举报

导航