论坛首页 入门技术论坛

Java 潜规则收集

浏览 9446 次
精华帖 (4) :: 良好帖 (19) :: 新手帖 (18) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-06-22   最后修改:2009-06-22
看了 Stack Overflow 上的 Hidden Features of Java ……
有些在 《Java 解惑》 里已经出现过了。

有 goto 关键字却不能用?
getout:{
    for (int i = 0; i < N; ++i) {
        for (int j = i; j < N; ++j) {
            for (int k = j; k < N; ++k) {
                break getout; // 打断循环跳到 OUT
            }
        }
    }
}
// OUT



enum 可以当类写
// 出自 Sun 的例子(Sun 真的很喜欢太阳系,但他们不知道冥王星已经出局了么?)
public enum Planet {
  MERCURY (3.303e+23, 2.4397e6),
  VENUS   (4.869e+24, 6.0518e6),
  EARTH   (5.976e+24, 6.37814e6),
  MARS    (6.421e+23, 3.3972e6),
  JUPITER (1.9e+27,   7.1492e7),
  SATURN  (5.688e+26, 6.0268e7),
  URANUS  (8.686e+25, 2.5559e7),
  NEPTUNE (1.024e+26, 2.4746e7),
  PLUTO   (1.27e+22,  1.137e6);

  private final double mass;   // 质量/千克
  private final double radius; // 半径/米
  Planet(double mass, double radius) {
      this.mass = mass;
      this.radius = radius;
  }
  public double mass()   { return mass; }
  public double radius() { return radius; }

  // 重力常数/(立方米每千克秒平方)
  public static final double G = 6.67300E-11;

  public double surfaceGravity() {
      return G * mass / (radius * radius);
  }
  public double surfaceWeight(double otherMass) {
      return otherMass * surfaceGravity();
  }
}

// 如何使用
public static void main(String[] args) {
    Planet pEarth = Planet.EARTH;
    //..
    pEarth.radius();
    pEarth.surfaceGravity();
    pEarth.surfaceWeight(12.0);
    //..
}

一点幕后 —— 因为 enum 是 Enum 的语法糖,抽象类 Enum 大约长这个样子:(FX 告诉我的)
public abstract class Enum<E extends Enum<E>> { ...  

public enum Planet { 会被展开成一个奇怪的东西:
public class Planet extends Enum<Planet> { ... 



双花实例初始化块
Map map = new HashMap() {{
    put("a key", "a value");
    put("another key", "another value");
}};



在代码中直接写 URL
class Example {
  public static void main(String[] args) {
    http://www.iteye.com
    System.out.println("Hello World!");
  }
}

其实是 label 加注释。


如果在函数 return 后还要做些事情……
try { return 1; }
finally { System.out.println("Bye!"); }


   发表时间:2009-06-22  
enum还不只是简单的语法糖。enum的实现方式保证它的每个成员都是单例。
public abstract class Enum<E extends Enum<E>> implements Comparable<E>, Serializable

忘了是Neal Gafter还是Josh Bloch说Java里要实现Singleton最简单的办法就是用enum了。
enum的成员还可以覆盖方法……看这个:那啥……穷举实现的24点(rev1),那个enum Operator。

finally那个着实恶心……以前记过一篇,finally子语里的return...险恶啊
0 请登录后投票
   发表时间:2009-07-02  
那个双花括号的用法有点意思。
0 请登录后投票
   发表时间:2009-07-03  
还真第一次看见,代码简洁,学习了,
0 请登录后投票
   发表时间:2009-07-03  
goto那个牵强附会了,不要提供错误的引导
你能向前break吗?
break 和 goto 还是有差别的
0 请登录后投票
   发表时间:2009-07-03  
break 能做部分 C 里面 goto 才能做的事情,觉得总比没有的好。

本人是 java 黑,意见不值得参考 ……
0 请登录后投票
   发表时间:2009-07-04  
return之后还可以执行语句?  finally语句块中的是在return之后执行? 望指点
0 请登录后投票
   发表时间:2009-07-04  
rober 写道
return之后还可以执行语句?  finally语句块中的是在return之后执行? 望指点

参考 1 楼 FX 给的链接。如果在 finally 中 return,那么前面的 return 会被覆盖。
1 请登录后投票
   发表时间:2009-07-04   最后修改:2009-07-04
class Example {  
  public static void main(String[] args) {  
    http://www.iteye.com  
    System.out.println("Hello World!");  
  }  


还是这个比较酷!
1 请登录后投票
   发表时间:2009-07-04  
night_stalker 写道
看了 Stack Overflow 上的 Hidden Features of Java ……
有些在 《Java 解惑》 里已经出现过了。

有 goto 关键字却不能用?
getout:{
    for (int i = 0; i < N; ++i) {
        for (int j = i; j < N; ++j) {
            for (int k = j; k < N; ++k) {
                break getout; // 打断循环跳到 OUT
            }
        }
    }
}
// OUT



enum 可以当类写
// 出自 Sun 的例子(Sun 真的很喜欢太阳系,但他们不知道冥王星已经出局了么?)
public enum Planet {
  MERCURY (3.303e+23, 2.4397e6),
  VENUS   (4.869e+24, 6.0518e6),
  EARTH   (5.976e+24, 6.37814e6),
  MARS    (6.421e+23, 3.3972e6),
  JUPITER (1.9e+27,   7.1492e7),
  SATURN  (5.688e+26, 6.0268e7),
  URANUS  (8.686e+25, 2.5559e7),
  NEPTUNE (1.024e+26, 2.4746e7),
  PLUTO   (1.27e+22,  1.137e6);

  private final double mass;   // 质量/千克
  private final double radius; // 半径/米
  Planet(double mass, double radius) {
      this.mass = mass;
      this.radius = radius;
  }
  public double mass()   { return mass; }
  public double radius() { return radius; }

  // 重力常数/(立方米每千克秒平方)
  public static final double G = 6.67300E-11;

  public double surfaceGravity() {
      return G * mass / (radius * radius);
  }
  public double surfaceWeight(double otherMass) {
      return otherMass * surfaceGravity();
  }
}

// 如何使用
public static void main(String[] args) {
    Planet pEarth = Planet.EARTH;
    //..
    pEarth.radius();
    pEarth.surfaceGravity();
    pEarth.surfaceWeight(12.0);
    //..
}

一点幕后 —— 因为 enum 是 Enum 的语法糖,抽象类 Enum 大约长这个样子:(FX 告诉我的)
public abstract class Enum<E extends Enum<E>> { ...  

public enum Planet { 会被展开成一个奇怪的东西:
public class Planet extends Enum<Planet> { ... 



双花实例初始化块
Map map = new HashMap() {{
    put("a key", "a value");
    put("another key", "another value");
}};



在代码中直接写 URL
class Example {
  public static void main(String[] args) {
    http://www.iteye.com
    System.out.println("Hello World!");
  }
}

其实是 label 加注释。


如果在函数 return 后还要做些事情……
try { return 1; }
finally { System.out.println("Bye!"); }



0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics