第19条:接口只用于定义类型
这一条就举了一个反例,说有些接口中只包含常量。这是对接口的不良使用。要实现相同的功能,应该使用不可实例化的工具类(第4条说过)。
public class PhysicalConstants { private PhysicalConstants() { } // Prevents instantiation // Avogadro‘s number (1/mol) public static final double AVOGADROS_NUMBER = 6.02214199e23; // Boltzmann constant (J/K) public static final double BOLTZMANN_CONSTANT = 1.3806503e-23; // Mass of the electron (kg) public static final double ELECTRON_MASS = 9.10938188e-31; }
另外,还学了一招,如果大量使用的话,就需要一直用类似PhysicalConstants.AVOGADROS_NUMBER的方式来调用。这时,可以用java的静态导入机制(只是小技巧)。就是采用import static com.effectivejava.PhysicalConstants.*;的方式导入类,然后就可以直接使用常量AVOGADROS_NUMBER,而不必要加类名。
参考http://www.cnblogs.com/mengdd/archive/2013/01/23/2873312.html
第20条:类层次优于标签类
这里面也是举了一个反例(标签类)。
class Figure { enum Shape { RECTANGLE, CIRCLE }; final Shape shape; //矩形有长和宽 double length; double width; //圆形有半径 double radius; Figure(double radius) { shape = Shape.CIRCLE; this.radius = radius; } Figure(double length, double width) { shape = Shape.RECTANGLE; this.length = length; this.width = width; } double area() { switch (shape) { case RECTANGLE: return length * width; case CIRCLE: return Math.PI * (radius * radius); default: throw new AssertionError(); } } }
这个类能够表示圆形或者矩形。但是层次很不分明,很乱。
正确的实现,也就是我们常用的实现,应该是写一个图形类作为基类,然后圆形类和矩形类分别实现。
abstract class Figure { abstract double area(); } class Circle extends Figure { final double radius; Circle(double radius) { this.radius = radius; } double area() { return Math.PI * (radius * radius); } } class Rectangle extends Figure { final double length; final double width; Rectangle(double length, double width) { this.length = length; this.width = width; } double area() { return length * width; } }
时间: 2024-10-01 23:33:49