`
leonzhx
  • 浏览: 814142 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Item 30: Use enums instead of int constants

阅读更多

1.  Programs that use the int enum pattern are brittle. Because int enums are compile-time constants, they are compiled into the clients that use them. If the int associated with an enum constant is changed, its clients must be recompiled. If they aren’t, they will still run, but their behavior will be undefined.

 

2.  The basic idea behind Java’s enum types is simple: they are classes that export one instance for each enumeration constant via a public static final field. Enum types are effectively final, by virtue of having no accessible constructors.

 

3.  enum types let you add arbitrary methods and fields and implement arbitrary interfaces. They provide high-quality implementations of all the Object methods, they implement Comparable and Serializable, and their serialized form is designed to withstand most changes to the enum type.

 

4.  There is a better way to associate a different behavior with each enum constant: declare an abstract method in the enum type, and override it with a concrete method for each constant in a constant-specific class body. Such methods are knows as constant-specific method implementations:

// Enum type with constant-specific method implementations
public enum Operation {
    PLUS { double apply(double x, double y){return x + y;} },
    MINUS { double apply(double x, double y){return x - y;} },
    TIMES { double apply(double x, double y){return x * y;} },
    DIVIDE { double apply(double x, double y){return x / y;} };
    abstract double apply(double x, double y);
}

 

Abstract methods in an enum type must be overridden with concrete methods in all of its constants.

 

5.  Enum types have an automatically generated valueOf(String) method that translates a constant’s name into the constant itself. If you override the toString method in an enum type, consider writing a fromString method to translate the custom string representation back to the corresponding enum.

 

6.  Enum constructors aren’t permitted to access the enum’s static fields, except for compile-time constant fields. This restriction is necessary because these static fields have not yet been initialized when the constructors run.

 

7.  Consider the strategy enum pattern if multiple enum constants share common behaviors:

// The strategy enum pattern
enum PayrollDay {
    MONDAY(PayType.WEEKDAY), TUESDAY(PayType.WEEKDAY),
    WEDNESDAY(PayType.WEEKDAY), THURSDAY(PayType.WEEKDAY),
    FRIDAY(PayType.WEEKDAY),
    SATURDAY(PayType.WEEKEND), SUNDAY(PayType.WEEKEND);
    private final PayType payType;
    PayrollDay(PayType payType) { this.payType = payType; }
    double pay(double hoursWorked, double payRate) {
        return payType.pay(hoursWorked, payRate);
    }
    // The strategy enum type
    private enum PayType {
        WEEKDAY { 
            double overtimePay(double hours, double payRate) {
                return hours <= HOURS_PER_SHIFT ? 0 : (hours - HOURS_PER_SHIFT) * payRate / 2;
            }
        },
        WEEKEND {
            double overtimePay(double hours, double payRate) {
                return hours * payRate / 2;
            }
        };
        private static final int HOURS_PER_SHIFT = 8;
        abstract double overtimePay(double hrs, double payRate);
        double pay(double hoursWorked, double payRate) {
            double basePay = hoursWorked * payRate;
            return basePay + overtimePay(hoursWorked, payRate);
        }
    }
}

 

分享到:
评论

相关推荐

    effectice_java第二版 英文

    10. **条目10:优先考虑使用枚举而非int常量(Use Enums Instead of Int Constants)** 枚举提供了类型安全,可以方便地添加方法和实现接口,比使用整数常量更易管理和维护。 11. **条目11:使用泛型(Generics)*...

    Google C++ Style Guide(Google C++编程规范)高清PDF

    All of a project's header files should be listed as descentants of the project's source directory without use of UNIX directory shortcuts . (the current directory) or .. (the parent directory). For...

    python3.6.5参考手册 chm

    Views And Iterators Instead Of Lists Ordering Comparisons Integers Text Vs. Data Instead Of Unicode Vs. 8-bit Overview Of Syntax Changes New Syntax Changed Syntax Removed Syntax Changes Already...

    基于gcc的stm32环境搭建源码+文档说明.zip

    基于gcc的stm32环境搭建源码+文档说明.zip,个人经导师指导并认可通过的高分设计项目,评审分99分,代码完整确保可以运行,小白也可以亲自搞定,主要针对计算机相关专业的正在做毕业设计的学生和需要项目实战练习的学习者,可作为毕业设计、课程设计、期末大作业,代码资料完整,下载可用。 基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的

    锂电池分选机:欧姆龙NJ501-1500与威伦通触摸屏驱动的先进工业自动化技术

    内容概要:本文详细介绍了欧姆龙NJ501-1500锂电池分选机的技术特点和工艺流程。该设备采用国际IEC 61131标准编程模式,具备伺服运动控制、高创直线电机DDR高速同步运动控制等功能,能进行电压测试、厚度测量等操作。设备配备雅马哈和ABB机械手,实现多轴协同作业,同时具备故障记录、产量统计及OEE功能,确保高效、精准的电池分选。此外,威伦通触摸屏提供的优质程序模板提升了编程效率。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是关注锂电池生产和分选设备的专业人士。 使用场景及目标:适用于需要提升锂电池分选效率和质量的企业,旨在帮助技术人员理解和应用先进的工业自动化技术,提高生产线的自动化水平和管理水平。 其他说明:文中附有详细的PLC程序、触摸屏程序、变量地址分配表、IO分配表、雅马哈机械手程序、ABB六轴机器人程序及电气原理图等资料,便于深入研究和实施。

    毕业论文-超级图文最新资源包及上传位置说明-整站商业源码.zip

    毕业论文-超级图文最新资源包及上传位置说明-整站商业源码.zip

    毕业论文-【超人】积分商城 5.2.26-整站商业源码.zip

    毕业论文-【超人】积分商城 5.2.26-整站商业源码.zip

    免费0积分--gc10-det yolo格式

    免费0积分--gc10-det yolo格式

    Abaqus软件应用于管中管系统深水管非线性动力分析:基于Tube-to-tube ITT单元的数值模拟

    内容概要:本文深入探讨了Abaqus软件在管中管系统深水管非线性动力分析中的应用,特别是基于Tube-to-tube ITT单元的数值模拟研究。文章首先介绍了管中管系统的基本概念及其在深海石油、天然气开发中的重要性。接着阐述了Abaqus软件的功能特点及其在复杂工程问题中的优势。随后详细讲解了如何在Abaqus中建立管中管系统的模型,包括定义材料属性、设定几何尺寸、处理接触关系等。还讨论了设置分析步和载荷的方法,强调了非线性动力分析的必要性。最后展示了求解与结果分析的具体步骤,并提供了相关代码片段以辅助理解和操作。 适合人群:从事海洋工程、石油天然气开发等领域工作的工程师和技术人员,尤其关注深水管系统非线性动力分析的专业人士。 使用场景及目标:适用于需要深入了解并掌握Abaqus软件在管中管系统深水管非线性动力分析中的应用方法,旨在提升对这类复杂系统的认识水平,优化设计方案,确保工程安全可靠。 其他说明:文中提供的代码片段有助于读者更快上手实际操作,使理论与实践相结合,便于后续工作中灵活运用所学知识。

    【电子设计竞赛】单相用电器分析监测装置设计:实现电器类别与工作状态的实时识别了文档的核心内容

    内容概要:本文档是2017年全国大学生电子设计竞赛的试题,针对单相用电器分析监测装置的设计与制作提出了具体任务和要求。该装置需具备学习和分析监测两种模式,在学习模式下测试并存储电器特征参量,在分析监测模式下实时指示用电器类别和工作状态。基本要求包括电器电流范围、可识别的电器工作状态数、响应时间、最小电流电器的自制等。发挥部分则鼓励提高装置性能,如学习功能优化、增强识别能力、低功耗设计以及无线传输等功能。文档还详细规定了参赛注意事项,如参赛队伍组成、比赛时间安排、纪律要求等,并给出了评分标准,涵盖设计报告、基本要求完成情况及发挥部分的表现; 适合人群:参加全国大学生电子设计竞赛的本科生及高职高专学生,特别是对电子设计、单相用电器监测感兴趣的团队; 使用场景及目标:①作为竞赛指南,帮助参赛队伍明确设计目标和要求;②指导参赛队伍进行单相用电器分析监测装置的设计与制作,确保满足竞赛的基本要求和发挥部分的要求; 其他说明:文档强调了参赛纪律,要求参赛者必须是有正式学籍的全日制在校生,并且在竞赛期间只能在学校指定场地内进行设计制作,不得与他人交流。此外,文档还提供了详细的评分标准,以确保评审过程的公平性和透明度。

    GB/T-7714-2015学位论文zotero格式更改csl文件

    GB/T-7714-2015学位论文zotero格式更改csl文件

    毕业论文-春磊引导页-极乐二次修改-整站商业源码.zip

    毕业论文-春磊引导页-极乐二次修改-整站商业源码.zip

    大学生就业指导.pdf

    大学生就业指导.pdf

    FIDIA数控主轴伺服驱动调试手册.pdf

    FIDIA数控主轴伺服驱动调试手册.pdf

    毕业论文-MIP建站平台 1.2.2加密版-整站商业源码.zip

    毕业论文-MIP建站平台 1.2.2加密版-整站商业源码.zip

    IDC数据中心布局与动力规划.pdf

    IDC数据中心布局与动力规划.pdf

    毕业论文-H5手机转盘活动游戏页面源码-整站商业源码.zip

    毕业论文-H5手机转盘活动游戏页面源码-整站商业源码.zip

    Python语言特性详解:函数参数传递、类与实例变量、装饰器及单例模式等核心技术

    内容概要:本文档涵盖了Python编程语言的多个重要特性和概念,包括函数参数传递、元类、静态方法与类方法的区别、类变量与实例变量的关系、自省特性、字典推导式、单下划线和双下划线的意义、字符串格式化、迭代器和生成器、`*args`和`**kwargs`的使用、面向切面编程(AOP)与装饰器、鸭子类型、函数重载、新式类与旧式类的区别、`__new__`和`__init__`的区别、单例模式的实现、作用域规则、线程全局锁(GIL)、协程、闭包、lambda函数、函数式编程、拷贝的区别、垃圾回收机制、列表操作、`is`关键字、文件读取方法、Python2与Python3的区别等。此外,还包括了一些操作系统、数据库、网络、数据结构等方面的知识点。 适合人群:具备一定编程基础,特别是对Python语言有一定了解的研发人员,尤其是工作1-3年的开发者。 使用场景及目标:①帮助读者深入了解Python语言的核心特性和高级用法;②为开发者提供解决实际编程问题的具体方法和技术;③为准备面试的程序员提供参考,涵盖常见的面试知识点。 其他说明:文档不仅提供了理论知识,还附带了大量的代码示例,便于读者理解和实践。部分内容链接了外部资源,供读者进一步深入学习。文档内容广泛,既适合日常编程学习,也适合面试准备。

    毕业论文-qiyeseo-整站商业源码.zip

    毕业论文-qiyeseo-整站商业源码.zip

    yolov5-simam

    加入注意力机制simam

Global site tag (gtag.js) - Google Analytics