zoukankan      html  css  js  c++  java
  • Effective Java2读书笔记-类和接口(四)

    第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();
            }
        }
    }
    View Code

    这个类能够表示圆形或者矩形。但是层次很不分明,很乱。

    正确的实现,也就是我们常用的实现,应该是写一个图形类作为基类,然后圆形类和矩形类分别实现。

    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;
        }
    }
  • 相关阅读:
    sqlalchemy的orm的高级用法,分组,排序,聚合等方法
    flask的SQLAlchemy,连接数据库的增删改查操作
    wtforms的form表单的高级用法
    初始wtforms表单,以及简单使用
    命令启动flask以及自定义命令
    MySQL5.5安装教程
    Java设计模式-策略模式实际应用场景
    Java设计模式-策略模式详解
    Oracle数据库之FORALL与BULK COLLECT语句
    代理模式详解(静态代理和动态代理的区别以及联系)
  • 原文地址:https://www.cnblogs.com/ZhangWanFan/p/5297986.html
Copyright © 2011-2022 走看看