`
swanky_yao
  • 浏览: 31649 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

看高手代码--从小case学大道理

阅读更多
今天看sun的HttpMessages.java文件,虽然文件很小,但是对我的启发很大。
前面定义了大量的HTTP常量:
    ...
    ...
    private static final String STATUS_305 = "Use Proxy";
    private static final String STATUS_307 = "Temporary Redirect";
    private static final String STATUS_400 = "Bad Request";
    private static final String STATUS_401 = "Unauthorized";
    private static final String STATUS_402 = "Payment Required";
    private static final String STATUS_403 = "Forbidden";
    private static final String STATUS_404 = "Not Found";
    private static final String STATUS_405 = "Method Not Allowed";
    private static final String STATUS_406 = "Not Acceptable";
    private static final String STATUS_407 = "Proxy Authentication Required";
    private static final String STATUS_408 = "Request Timeout";
    ...
    ...

也可以趁机从这里查看HTTP返回值的意义^_^。然后定义了一个java.util.concurrent.ConcurrentHashMap的变量httpStatusCodeMappings,再往里面添加刚才定义的常量(这个操作放在了一个静态块里),如:
static {
        httpStatusCodeMappings.put("sc.100", STATUS_100);
        httpStatusCodeMappings.put("sc.101", STATUS_101);
        httpStatusCodeMappings.put("sc.200", STATUS_200);
        httpStatusCodeMappings.put("sc.201", STATUS_201);
        httpStatusCodeMappings.put("sc.202", STATUS_202);
        httpStatusCodeMappings.put("sc.203", STATUS_203);
  ...
  ...

最重要的就是这个方法了,先看代码
public static String getMessage(int status) {

        // Return the status message for the most frequently used status
        // codes directly, without any lookup
        switch (status) {
            case 200: return STATUS_200;
            case 302: return STATUS_302;
            case 400: return STATUS_400;
            case 404: return STATUS_404;
	}

        return httpStatusCodeMappings.get("sc."+ status);
    }

这段代码的用途很简单,就是要返回状态码对应的Message,而这些这些消息都已经存放在httpStatusCodeMappings变量里了,为了提高访问常用的几个返回码的Message,它直接用了一个静态块,而不去lookup那个map了,这就是高手!
分享到:
评论
76 楼 guanliScott 2010-06-02  
haha, 技巧算不上吧,
态度,能优化顺手优化。

支持新手帖
75 楼 xxxu 2010-06-02  
路过围观。
74 楼 徐风子 2010-06-02  
skydream 写道
sw1982 写道
...lookup 一下hashmap真的那么低效吗? 建议复习下数据结构哦,你这些总结是没错,可是很表面


典型的没有写过高并发程序的思维方式,明明可以节约的地方,仅仅几行代码就可以优化,偏偏不做。

hashmap再快,也比case 一个 整型满上1w倍。

性能,是一点一点挤牙膏挤出来的,哪能到处浪费啊。

首先,谁说hash表比case慢一万倍的??
其实case的代码实现是 if ..else if形式的,复杂度是O(n)
hashMap 的复杂度是 O(1),当然里面的实现有函数调用,(函数调用的效率我没测试过,不过据《代码大全2》里面的资料,java的函数调用所消耗的时间和 普通赋值语句相同。) 就是说hashMap实际操作时间不过 十几个 语句周期。

代码最大的问题是 明明是一堆静态常量,为什么要用 ConcurrentHashMap??

感觉实际编码的过程是: 开始不知道为什么使用了一个大而全,含义复杂的map,(所以做成同步,key中出现了字符串拼装),后来发现效率不够,于是打补丁,就出现了那堆case。 没什么好说的,不过是一堆临时代码,真正应该做的是重构应该重新定义Map的结构。

其实这种东西效率最高的是 以空间换时间:
String[] httpStatusCode = new int[600];
httpStatusCode[404] = "Not Found";
………………
只是多使用了 600 * 8 = 4.8k空间。

或者最普通的方式,使用:
com.google.common.collect.ImmutableMap
73 楼 zhaona1986 2010-06-02  
你们这帮老爷们,TMD还是男人吗!!!
为这个问题,你骂我,我骂你的!
搞到最后还搞出了火药味了!!!
      你们TMD每个人从事的领域可能都不同,当然会对这个问题会有不同的观念!这从你们TMD刚开始工作所踏入的领域一直到现在所决定的!
      扯着嗓子在这喊,叫有意思吗?
      有的领域要快速开发,要效率,有的领域,要仔细,要节省每一点资源!
      为什么吵来吵去都不知道这个根本的问题!!!
      TMD你让嵌入式的去写J2EE????
      TMD你让J2EE去写J2ME????
      可能吗?这三种人对楼主的看法,肯定都会不同的!!!
    
还有,楼主,你看着这些同行们,你我他都TMD的可怜的程序员为这个问题自相互骂,有意思,很得意?
72 楼 zhaona1986 2010-06-02  
超级潜水员 写道
arthas777 写道
iaimstar 写道
skydream 写道
sw1982 写道
...lookup 一下hashmap真的那么低效吗? 建议复习下数据结构哦,你这些总结是没错,可是很表面


典型的没有写过高并发程序的思维方式,明明可以节约的地方,仅仅几行代码就可以优化,偏偏不做。

hashmap再快,也比case 一个 整型满上1w倍。

性能,是一点一点挤牙膏挤出来的,哪能到处浪费啊。

一个团队好多个人

指望所有人都挤牙膏,开玩笑

顶多就是核心代码慎重一些

整个项目再整体测试一下性能瓶颈,有针对性的调整就好了

每句代码都想写的句句珠玑,既不可能,也不现实。

在需求允许的范围内,尽量的提高开发效率,才能适时的交出合适的作业


    呵呵 "在需求允许的范围内,尽量的提高开发效率,才能适时的交出合适的作业"
    所以说,你已沦为这恶劣环境下的奴隶,没有自我了!
   


最烦你这种人, 在性能允许的情况下. 可读性,可维护性优先于性能.
去写C不得,整天折腾到底是要用int呢,还是要用long类型.


          我很怀疑你的水平?你的意思是说写java, int和long根本就没有区别?是吧!!
          好白痴哦!
71 楼 madbluesky 2010-06-02  
超级潜水员 写道
杯具啊.... 良好战胜了新手贴....


我也觉得很悲剧啊.

70 楼 swanky_yao 2010-06-02  
上面很多讨论都在把性能与代码的可读性进行比较,本人始终没有觉得上面的代码有多难读,就是一个非常非常小的skill而已!这样的技巧还有很多很多,拿出来分享,很多高手都是这样积累起来的,多看看别人的代码,我觉得没有什么不妥!
69 楼 murainwood 2010-06-02  
恩,用C写CGI吧。
既然要锱铢必较,既然要所谓的精神。
68 楼 swanky_yao 2010-06-02  
tianmo2008 写道
是很简单但很实用的东西,但很多项目一开始的时候是很难预测到那些东西是常用的,所以很难提取出来,只有到后来出现性能问题了,对项目又有了比较深入的了解,才能把这些数据抽出来做特殊处理的.

ps:看贴的时候  良好贴19 vs 新手贴19
楼主得谢谢我的最后一贴啊,不然的话可能会成新手帖的批,哈哈

多谢 ^_^
67 楼 aofeng 2010-06-02  
很好的一个分享,没有什么好争论的。觉得好就拿去用,觉得不好那就按自己的想法做。
66 楼 iaimstar 2010-06-02  
arthas777 写道

    j2me,锱铢必较,一种精神!高并发,优化中再优化,也是一种精神!
    自己写的程序,最后积累的成果,也是一种精神!
    你可以拿中国大环境来宣扬你的理论!
    我没有必要把问题上升来跟你计较什么!
    但你没有资格剥夺其他程序员的精神!
                       ~~~~~~~~~~~~~~~懂???
    另注:老美可以做出《使命召唤》,而中国永远也做不出来!因为像你这样的写程序的太多太多了!
          在这种恶劣环境摧残下,你已经沦为奴隶!
   
    再另注:如果不知道《使命召唤》是什么,也没关系,去搜搜它的开发历程和团队素养!你就知道自己有多可怜了!
    所以说,你已沦为这恶劣环境下的奴隶,没有自我了!
   

哥,你最牛逼,行吧,不要没事就把民族大旗丢出来,我写程序,只为自己爱好,也不想和什么《使命召唤》的团队去比较,更不用搜搜,要讲传奇故事,我能给你讲一天。

   
arthas777 写道

   老美可以做出《使命召唤》,而中国永远也做不出来!因为像你这样的写程序的太多太多了


   你这话传播了十几年了,红字部分可以替代成任何词用在任何地方,有意思吗?
  
    
 
65 楼 xo_tobacoo 2010-06-02  
俺们按照一般思维写过这种代码,可是经理问?你确定效率高吗?你证明下看看?又问,即使效率高些,你认为这样会让其他人不太好理解这块代码?...企业开发要求都是中规中矩的
64 楼 超级潜水员 2010-06-02  
arthas777 写道
iaimstar 写道
skydream 写道
sw1982 写道
...lookup 一下hashmap真的那么低效吗? 建议复习下数据结构哦,你这些总结是没错,可是很表面


典型的没有写过高并发程序的思维方式,明明可以节约的地方,仅仅几行代码就可以优化,偏偏不做。

hashmap再快,也比case 一个 整型满上1w倍。

性能,是一点一点挤牙膏挤出来的,哪能到处浪费啊。

一个团队好多个人

指望所有人都挤牙膏,开玩笑

顶多就是核心代码慎重一些

整个项目再整体测试一下性能瓶颈,有针对性的调整就好了

每句代码都想写的句句珠玑,既不可能,也不现实。

在需求允许的范围内,尽量的提高开发效率,才能适时的交出合适的作业


    呵呵 "在需求允许的范围内,尽量的提高开发效率,才能适时的交出合适的作业"
    所以说,你已沦为这恶劣环境下的奴隶,没有自我了!
   


最烦你这种人, 在性能允许的情况下. 可读性,可维护性优先于性能.
去写C不得,整天折腾到底是要用int呢,还是要用long类型.

63 楼 超级潜水员 2010-06-02  
杯具啊.... 良好战胜了新手贴....
62 楼 tianmo2008 2010-06-01  
是很简单但很实用的东西,但很多项目一开始的时候是很难预测到那些东西是常用的,所以很难提取出来,只有到后来出现性能问题了,对项目又有了比较深入的了解,才能把这些数据抽出来做特殊处理的.

ps:看贴的时候  良好贴19 vs 新手贴19
楼主得谢谢我的最后一贴啊,不然的话可能会成新手帖的批,哈哈
61 楼 iaimstar 2010-06-01  
arthas777 写道
我很支持楼主!!
我以前做过j2me开发,我非常理解楼主的心情!
    顶你!
而且,我想对那些拿web不需要考虑细节性能的人说,你的web可能不支持高并发访问哦!


高并发和这个没啥主要关系好吧。 而且j2me和高并发更风马牛不相及。

j2me比较特殊,对各种资源 锱铢必较 是能理解的。
60 楼 dk101 2010-06-01  
我个人也觉得静态初始化块要慎用,因为它对性能还是有影响的,而且在很多时候,静态初始化块是可以用构造方法替代的。
59 楼 swanky_yao 2010-06-01  
arthas777 写道
我很支持楼主!!
我以前做过j2me开发,我非常理解楼主的心情!
    顶你!
而且,我想对那些拿web不需要考虑细节性能的人说,你的web可能不支持高并发访问哦!

还是女孩子说话温柔 前面火药味浓了点...^_^
58 楼 lgdlgd 2010-06-01  
swanky_yao 写道
lgdlgd 写道
如果代码真是这样的,那反而是很不注意小节啊,已经在CASE中过滤掉的那几个不应该再放到MAP中增加MAP的长度啊。

还有其他方法会用到这个map

凡是要用到这个MAP的,如果不取CASE那几项,那对它的调用没有影响啊,如果要用到那几项,就直接使用那个方法,所以都不影响啊。
57 楼 swanky_yao 2010-06-01  
lgdlgd 写道
如果代码真是这样的,那反而是很不注意小节啊,已经在CASE中过滤掉的那几个不应该再放到MAP中增加MAP的长度啊。

还有其他方法会用到这个map

相关推荐

    前端开源库-just-kebab-case

    // 输出:'camel-case-key' ``` 此外,"just-kebab-case"库可能还提供了其他高级功能,如批量转换数组中的字符串,或者与其他命名规则(如snake_case或PascalCase)相互转换。这使得它在处理多样化的数据源时非常...

    前端开源库-to-constant-case

    为了方便开发者快速地将字符串转换为常量大小写格式(即所有单词首字母大写,其余字母小写),有一个名为`to-constant-case`的前端开源库应运而生。这个库的主要功能就是将输入的任意字符串转换为常量风格的表示,...

    Excel-VBA宏编程实例源代码-以Select Case使用Like运算.zip

    本压缩包“Excel-VBA宏编程实例源代码-以Select Case使用Like运算.zip”包含了一个名为“以Select Case使用Like运算.xlsm”的文件,它是一个VBA宏启用的工作簿,展示了如何在Select Case语句中使用Like运算符进行...

    前端开源库-to-title-case

    使用 "to-title-case" 库可以显著简化代码,避免手动处理字符串大小写的繁琐工作。例如,以下是如何在项目中引入和使用这个库的示例: ```javascript // 假设已通过npm安装了to-title-case库 const toTitleCase = ...

    verilog源代码-FPGA-XILINX

    - 结构化语句:包括always块(用于组合逻辑和时序逻辑描述)、if-else、case等控制结构。 - 模块化设计:通过模块定义,可以将复杂设计分解为可重用的单元,提高代码复用性和可维护性。 - 并行执行:Verilog代码...

    Java高手-代码篇.pdf

    根据提供的信息来看,这份文档似乎包含了大量乱码和非可读字符,这可能是编码问题或者文档损坏导致的结果。不过,我们可以尝试从标题、描述以及标签中提取一些有用的信息,并围绕这些信息来构建相关的Java编程知识点...

    ISO 683-3-2022- Part 3_ Case-hardening steels.pdf

    ISO 683-3-2022 Heat-treatable steels, alloy steels and free-cutting steels - Part 3_ Case-hardening steels.pdf

    跟我学vb--第10课时-select-case语句.doc

    【VB中的Select Case语句详解】 在VB编程中,Select Case语句是一种多分支选择结构,用于根据一个表达式的值来执行相应的代码块。...在编程实践中,合理利用Select Case语句可以极大地提升开发效率。

    worst-case.rar_RAB_Worst-case_worst case_波束 稳健_稳健波束形成

    在IT行业中,尤其是在无线通信和信号处理领域,"worst-case.rar_RAB_Worst-case_worst case_波束 稳健_稳健波束形成"这个标题和描述涉及到的关键技术是"稳健波束形成"(Robust Beamforming)。这是一种优化无线通信...

    前端开源库-just-kebab-case.zip

    // 输出 "my-camel-case-string" ``` 以上就是关于`just-kebab-case`这个前端开源库的一些基本介绍和可能的功能。这个库的具体实现和API可能会根据作者的设计有所不同,但其核心目的都是为了帮助开发者更高效地...

    最新完整版标准 ISO 683-3-2022 - Part 3_ Case-hardening steels.pdf

    最新完整版标准 ISO 683-3-2022 Heat-treatable steels, alloy steels and free-cutting steels - Part 3_ Case-hardening steels.pdf

    前端开源库-title-case-minors

    "前端开源库-title-case-minors"这个项目,正如其名,专注于处理标题大小写的问题,特别是针对那些在标题字符串中不应大写的未成年人单词(即不重要的或非专有名词的词汇)。 标题大小写是一种常见的文本格式规范,...

    前端开源库-to-sentence-case

    在实际项目中,"to-sentence-case"可能通过npm(Node.js的包管理器)进行安装,然后在JavaScript代码中导入并调用其提供的函数。例如: ```javascript const toSentenceCase = require('to-sentence-case'); let ...

    Atom-atom-change-case,节点的Atom插件.zip

    Node.js的change-case库提供了一系列方法,包括将字符串转为全大写、全小写、首字母大写等,这个插件将这些功能无缝集成到了Atom中,极大地提高了代码操作的效率。 安装"Atom-atom-change-case"插件非常简单,只需...

    Cisco - Ccie Fundamental - Network Design And Case Studies.PDF

    Cisco - Ccie Fundamental - Network Design And Case Studies.PDF

    前端开源库-to-snake-case

    在 "to-snake-case-master" 压缩包中,通常会包含以下内容: 1. **源代码文件**:例如 `index.js`,这是实现字符串转换功能的主要代码。 2. **测试文件**:可能有一个 `test` 目录,包含了单元测试,用于验证库的...

    前端开源库-to-capital-case

    `to-capital-case-master` 这个压缩包文件名可能是库的源码主分支,包含所有源代码、测试文件、文档和可能的配置文件。在使用前,你需要将其解压并根据项目需求进行安装和配置。如果库提供了README文件,里面通常会...

    eBay, Inc. and Amazon.com (A).pdf -- Harvard Business School case

    eBay, Inc. and Amazon.com (A).pdf -- Harvard Business School case

    金鹰asp超速入门视频教程-026.Select Case语句.rar

    【ASP基础与Select Case语句】 ASP(Active Server Pages)是一种微软公司开发的服务器端脚本环境,用于创建...通过实践和不断的练习,你会更加熟练地运用ASP中的Select Case语句,为你的网站开发工作带来极大的便利。

Global site tag (gtag.js) - Google Analytics