例如:

  1. /**
  2. * 加减乘除枚举
  3. * Created by yulinfeng on 8/20/17.
  4. */
  5. public enum Operation {
  6. PLUS {
  7. double apply(double x, double y) {
  8. return x + y;
  9. }
  10. },
  11. MIUS {
  12. double apply(double x, double y) {
  13. return x - y;
  14. }
  15. },
  16. TIMES {
  17. double apply(double x, double y) {
  18. return x * y;
  19. }
  20. },
  21. DEVIDE {
  22. double apply(double x, double y) {
  23. return x / y;
  24. }
  25. };
  26.  
  27. abstract double apply(double x, double y);
  28. }

同时提到当需要新增一个操作符时直接在源代码中新增即可,且不会忘记重写apply方法,但从软件开发的可扩展性来说这并不是一个好的方法,软件可扩展性并不是在原有代码上做修改,如果这段代码是在jar中的呢?这个时候就需要接口出场了,我们修改上述例子:

  1. /**
  2. * 操作符接口
  3. * Created by yulinfeng on 8/20/17.
  4. */
  5. public interface Operation {
  6. double apply(double x, double y);
  7. }
  1. /**
  2. * 基本操作符,实现自Operation接口
  3. * Created by yulinfeng on 8/20/17.
  4. */
  5. public enum BasicOperation implements Operation{
  6. PLUS("+") {
  7. public double apply(double x, double y) {
  8. return x + y;
  9. }
  10. },
  11. MIUS("-") {
  12. public double apply(double x, double y) {
  13. return x - y;
  14. }
  15. },
  16. TIMES ("*") {
  17. public double apply(double x, double y) {
  18. return x * y;
  19. }
  20. },
  21. DEVIDE ("/") {
  22. public double apply(double x, double y) {
  23. return x / y;
  24. }
  25. };
  26. private final String symbol;
  27.  
  28. BasicOperation(String symbol) {
  29. this.symbol = symbol;
  30. }
  31. }

当我们需要扩展操作符枚举的时候只需要重新实现Operation接口即可:

  1. /**
  2. * 扩展操作符
  3. * Created by yulinfeng on 8/20/17.
  4. */
  5. public enum ExtendedOperation implements Operation {
  6. EXP ("^") {
  7. public double apply(double x, double y) {
  8. return Math.pow(x, y);
  9. }
  10. },
  11. REMAINDER ("%") {
  12. public double apply(double x, double y) {
  13. return x % y;
  14. }
  15. };
  16. private final String symbol;
  17.  
  18. ExtendedOperation(String symbol) {
  19. this.symbol = symbol;
  20. }
  21. }

effective_java 第34条:用接口模拟可伸缩的枚举的更多相关文章

  1. Effective Java 第三版——38. 使用接口模拟可扩展的枚举

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  2. Javascript 接口模拟

    Javascript接口模拟可以通过三种方式实现文档手段(注释).辅助类和鸭式辨. 第一种和第二种只形式上体现没有真正的实现. 鸭式辨实现原理是:"只要能像鸭子一样叫和走就是鸭子" ...

  3. Yahoo!网站性能最佳体验的34条黄金守则

    Yahoo!的Exceptional Performance团队为改善Web性能带来最佳实践.他们为此进行了一系列的实验.开发了各种工具.写了大量的文章和博客并在各种会议上参与探讨.最佳实践的核心就是 ...

  4. (转)雅虎WEB前端网站优化 -- 34条军规

    雅虎给出了优化网站加载速度的34条法则(包括Yslow规则22条) 详细说明,下载转发 ponytail 的译文(来自帕兰映像). 1.Minimize HTTP Requests 减少HTTP请求 ...

  5. 【转】SoapUI5.0创建WebService接口模拟服务端

    原文:http://blog.csdn.net/a19881029/article/details/26348627 使用SoapUI创建WebService接口模拟服务端需要接口描述文件 MathU ...

  6. YAHOO 34 条前端优化建议

    雅虎团队经验:网站页面性能优化的34条黄金守则 1.尽量减少HTTP请求次数       终端用户响应的时间中,有80%用于下载各项内容.这部分时间包括下载页面中的图像.样式表.脚本.Flash等.通 ...

  7. 雅虎WEB前端网站优化 -- 34条军规

    雅虎给出了优化网站加载速度的34条法则(包括Yslow规则22条) 详细说明,下载转发 ponytail 的译文(来自帕兰映像). 1.Minimize HTTP Requests 减少HTTP请求 ...

  8. oracle提高查询效率的34条方法

    注:本文来源:远方的守望者  <oracle提高查询效率的34条方法> oracle提高查询效率的34条方法 1.选择最有效率的表名顺序 (只在基于规则的优化器中有效): ORACLE的解 ...

  9. SoapUI5.0创建WebService接口模拟服务端(转)

    转载自:https://blog.csdn.net/a19881029/article/details/26348627 使用SoapUI创建WebService接口模拟服务端需要接口描述文件 Mat ...

随机推荐

  1. 稠州银行数字化转型:打造银行数据大脑,建立全新数字化DNA

    数字经济时代,银行如何进行数字化转型?业务模式转型与科技转型如何协同并进? 2019年1月4日,在上海蚂蚁金服ATEC城市峰会上,浙江稠州商业银行(以下简称“稠州银行”)副行长兼首席信息官程杰分享了稠 ...

  2. ZJOI-2017 R2 游记

    来说说考试(之前的事明天再补): 开始看了一遍所有题目,感觉第二题最可做的样子(ZJOI R1树状数组,HNOI splay 你们西方什么题我还没见过,淦!),大概感觉了一下所有题. T1:k=1直接 ...

  3. time to set up Goals

    Function Goal Training for new guys, meanings who takes part of QA jobs  and make other QA members g ...

  4. es6开发环境搭建,babel 将es6转化成es5

    工欲善其事,必先利其器.所以我们第1节就是搭建一个基本的ES6开发环境.现在的Chrome浏览器已经支持ES6了,但是有些低版本的浏览器还是不支持ES6的语法,这就需要我们把ES6的语法自动的转变成E ...

  5. NGUI实现滑动屏幕的时候,进行环形旋转

    在滑动屏幕的时候,上图中的内容饶圆中心旋转,并且箭头的方向保持不变 每个Item上挂载的脚本: using UnityEngine; public class ItemTest : MonoBehav ...

  6. Spring Boot 返回 JSON 数据,一分钟搞定!

    如何返回 JSON 数据? 在 Spring Boot 中返回 JSON 数据很简单,如下几步. 加入依赖 12345678910 <parent> <groupId>org. ...

  7. js判断输入的input内容是否为数字

    有时候我们输入的input的内容需要判断一下是否是数字,所以为了更好的客户体验,在前端先处理一下: <input type="text" name="val&quo ...

  8. nginx的前世今生

    Nginx最初的设计是称为一个http服务器,一个能够解决C10K问题的http服务器. 那么问题来了,什么是C10K呢?C10K问题即(单机10万个并发链接问题),这个概念最早是由Dan Kegel ...

  9. XV Open Cup named after E.V. Pankratiev. GP of Siberia-Swimming

    给出两个点,找到过这两个点的等角螺线,并求出中间的螺线长 $c = \frac{b}{a}$ $p = a \times c^{\frac{\theta}{angle}}$ 对弧线积分 #includ ...

  10. 使用 HttpClient 进行文件上传

    1.使用 AddPart 方法 public static void upload(String authorization,String baseUrl,String filePath,String ...