站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2SE 专题J2SE1.5的新特点(之二)

J2SE1.5的新特点(之二)

摘要: J2SE1.5的新特点(之二)

J2SE1.5的新特点(之二)<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /> 类型安全的枚举比以前的枚举有什么优点呢?

有如下特点:

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

一般来说:上面的那些特点简单的从语义上支持了模式。看下面的例子,和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

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




↑返回目录
前一篇: 克服J2SE 1.3 ~ 1.4不兼容问题
后一篇: J2SE1.5的新特点(之一)