CSDN博客

img accesine960
博客专家

J2SE1.5的新特点(之二)

发表于2003/5/27 11:14:00  1213人阅读

J2SE1.5的新特点(之二)

 类型安全的枚举比以前的枚举有什么优点呢?

有如下特点:

  • 提供编译时int枚举的安全检查,同时不再提供其他类型安全检查。
  • 提供了枚举的命名空间
  • 可以直接把它们放到集合中。
  • 因为他们本质上是类,你可以向里面添加属性和方法。

上面的这些特点的确不错。能讲讲类型安全的枚举语言的特点和类型安全的枚举模式的关系吗?

 一般来说:上面的那些特点简单的从语义上支持了模式。看下面的例子,和C/C++ 枚举的声明很相似:

    enum Season { winter, spring, summer, fall }

声明虽然相似,但是确让编译器实现了上面提到的许多特性。你还可以把Season用到switch的判断语句中。

 请举例说明“类型安全的枚举”的优点。

 下面是一个表示每分枚举类型的例子。

public enum Coin {

    penny(1), nickel(5), dime(10), quarter(25);

    Coin(int value) { this.value = value; }

    private final int value;

    public int value() { return value; }

}

这是个创举。我们定义了value来作为读取Coin的公共变量。在枚举的构造函数中可以在声明枚举实例的时候来初始化它。

让我们看看进一步使用这个枚举的例子。

我把不的呢。下面的程序打印一个表格和其中coin的大小和颜色。

public class CoinTest {

    public static void main(String[] args) {

        for (Coin c : Coin.VALUES)

            System.out.println(c + ":   /t"

                  + c.value() +"¢ /t" + color(c));

    }

    private enum CoinColor { copper, nickel, silver }

    private static CoinColor color(Coin c) {

        switch(c) {

          case Coin.penny:   return CoinColor.copper;

          case Coin.nickel:  return CoinColor.nickel;

          case Coin.dime:

          case Coin.quarter: return CoinColor.silver;

          default: throw new AssertionError("Unknown coin: " + c);

        }

    }

}

太帮了。那么静态引入static import 的功能对程序员有什么帮助呢?

 首先他避免了程序员使用前缀的静态成员。以前常见的的一个替代的做法是:

// "Constant Interface" antipattern – 不推荐的做法

public interface Physics {

  public static final double AVOGADROS_NUMBER   = 6.02214199e23;

  public static final double BOLTZMANN_CONSTANT = 1.3806503e-23;

  public static final double ELECTRON_MASS      = 9.10938188e-31;

}

 

public class Guacamole implements Physics {

    public static void main(String[] args) {

        double moles = ...;

        double molecules = AVOGADROS_NUMBER * moles;

        ...

    }

}

上面的做法达到了效果,可是却违背了一些设计原则。接口是用来定义方法和类型的,不是提供常量声明的。而且只是由Guacamole使用的常量也暴露给了使用其的客户端。

静态引入功能提供了一个简单的实现。这个功能和包的import功能类似。

import static org.iso.Physics.*;

 

class Guacamole {

    public static void main(String[] args) {

        double molecules = AVOGADROS_NUMBER * moles;

        ...

    }

}

 明白,那么什么是元数据类型metadata的功能呢?

 使用metadata和第三方工具提供商可以让程序员自己的日子好过点。

以前许多发布API需要大量的描述信息。比如:定义一个JAX-RPC 网络服务API你需要提供其接口和实现类。如下:

public interface CoffeeOrderIF extends java.rmi.Remote {

    public Coffee [] getPriceList()

        throws java.rmi.RemoteException;

    public String orderCoffee(String name, int quantity)

        throws java.rmi.RemoteException;

}

 

public class CoffeeOrderImpl implements CoffeeOrderIF {

    public Coffee [] getPriceList() {

        ...

    }

    public String orderCoffee(String name, int quantity) {

        ...

   }

}

使用元数据功能,你可以节省大量的工作。你所需要做的是在代码上加上特殊的注释。你所使用的开发工具可是使用这些注释自动生成相关的代吗。如下所示:

import javax.xml.rpc.*;

 

public class CoffeeOrder {

    @Remote public Coffee [] getPriceList() {

        ...

    }

    @Remote public String orderCoffee(String name, int quantity) {

        ...

    }

}

 

  的确非常好,可是我们不可能定义所有的属性和注释呀?

是的,但是 JSR-175  现在提供了一个 framework 让第三方来定义属性和相关的工具。

全文完

==============

有些地方翻译的不准确希望大家原谅

accesine@163.com

==============

0 0

相关博文

我的热门文章

img
取 消
img