`
wang_hao_long
  • 浏览: 1886 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

编写高质量代码 读书笔记2

 
阅读更多

第7章 泛型和反射

 

 

<!--?xml version="1.0" encoding="UTF-8" standalone="no"?--> 1 获取一个泛型的实际泛型类型

          class Utils {
 
     // clz一定是子类的class,并且子类一定明确了父类的泛型T
     public static Class getTClass(Class clz) {

          // 获取clz父类的泛型type
          Type type = clz.getGenericSuperclass();

          if (type instanceof ParameterizedType) {
               ParameterizedType pt = (ParameterizedType) type;
               // 得到泛型列表
               Type[] types = pt.getActualTypeArguments();

               if (types.length > 0 && types[0] instanceof Class) {
                    return (Class) types[0];
               }
     }
     return (Class) Object.class;
     }
} 
  

<!--?xml version="1.0" encoding="UTF-8" standalone="no"?--> 2 Class.forNmae不适合加载数组,建议使用Array.newInstance的方式

   String[] strs = (String[]) Array.newInstance(String.class,8)
       int[][] ints = (int[][]) Array.newInsgtance(int.class,2,3)
 
3 3 反射中的Accessible:用来判断是否需要安全检查,在大量使用反射的情况下,设置Accessible=true(表示不需要安全检查),可以提高性能20部以上)

第8章:异常

<!--?xml version="1.0" encoding="UTF-8" standalone="no"?-->  1  不要在finally块中处理返回值
      原因:  (1) 覆盖了try块中的return返回值
                (2) 屏蔽异常:
                         如果try块中抛出了异常,但是finally块中直接return了,异常就会被屏蔽掉

2  构造函数不建议抛出异常

        原因: (1) 构造函数没有覆盖的概念,而且子类的构造函数可以抛出比父类更加宽泛的异常,这样就会违反里氏替换原则
   
                假设 Parent类的构造函数抛出IOException,sub类的构造函数抛出Exception.
                将new Parent() 替换成 new Sub()时,就会需要更改异常处理的代码,这就违反了里氏替换原则

                (2) 导致子类代码膨胀

                如果父类默认构造函数抛出了异常,子类构造函数正好调用了父类的无参构造函数,则子类也需要throws父类的异常或父类异常的父类

        总之  不建议构造方法抛出异常

 3  通过new Throwable().getStackTrace() 方法获取当前栈信息 : Throwable类的构造函数会记录下栈帧信息

例子如下

 public class Hi{public static void main(String[] args){
         Throwable ex = new Throwable();
          StackTraceElement[] stackElements = ex.getStackTrace();
         if(stackElements != null){for(int i = 0; i < stackElements.length; i++) {
               System.out.println(stackElements[i].getClassName());
               System.out.println(stackElements[i].getFileName());
               System.out.println(stackElements[i].getLineNumber());
               System.out.println(stackElements[i].getMethodName());

  }}}}


第9章 多线程和并发


<!--?xml version="1.0" encoding="UTF-8" standalone="no"?-->

    1  Thread类中有一个stopBeforeStart:标志着是在线程启动前设置了停止标志.
         (1) 如果在线程没有调用start前,调用了stop方法,则stopBeforeStart会设置成true
         (2) start方法会先将线程启动,然后判断stopBeforeStart==true时,将线程停止,所以线程在启动前,先调用stop方法后,在调用start方法会导致线程运行先运行后停止

      2 不建议使用stop
          原因:stop会直接将线程停止,所以会导致代码逻辑不完整,破坏原子逻辑,舍去所以的锁

      3 线程异常处理器:UncaughtExceptionHandler

      4 volatile可以保证变量的可见性,但是无法保证同步

      5 线程的状态
      
              线程运行时间可分成3部分:启动(新建),可运行(运行,阻塞,等待),终结(销毁)
     
              启动==>可运行==>终结的顺序不可逆.

         为了减少启动和销毁线程的时间,线程池出现了.
         
         正常情况下一个线程执行完run方法的逻辑后,会被销毁,销毁后的线程无法调用start再次进入运行状态.所以为了保证线程池中的线程在启动后,随时可运行,需要确保线程执行完任务后,保持阻塞状态,而不是被销毁.Java并发包中的线程池实现就是采用阻塞队列确保线程在没有任务时阻塞,而不是被销毁

        6  并发包线程池实现
            
            主要有3个主要部分:任务队列(采用阻塞队列),工作线程和任务接口
                 
                  (1) 任务接口:runnable ,callable接口,
                  (2)  任务队列:存放等待处理的任务,一般是BlockingQueue的实现类
                  (3) 工作线程:线程池中的线程,一般是在可运行状态或者等待阻塞状态下的线程


         7 lock可实现公平锁
     
                 (1) lock.tryLock  :自旋锁,可以只定等待时间,等待时间内无法获得锁,自行终结任务.注意:在没有得到锁时,线程会自旋在那里,不会放弃cpu

         8 阻塞队列blockingQueue:
               
               (1)  阻塞队列的容量是固定的,无法超出,否则抛异常.默认初始容量为integer的最大值

               (2)  特殊的put方法:如果队列已经满了,put操作会一直循环等待,直到插入为止 
<!--?xml version="1.0" encoding="UTF-8" standalone="no"?-->
分享到:
评论

相关推荐

    代码质量-读书笔记

    【代码质量】这一主题在IT行业中占据着至关重要的地位,它是软件开发过程中的基石,直接影响到项目的稳定性和可维护性。...通过不断学习和实践,我们可以编写出更高质量的代码,为软件项目奠定坚实的基础。

    (读书笔记)《编写好质量代码》--马伟

    综上所述,《编写好质量代码》这本书中的建议涵盖了从数据类型的选择到程序控制语句的优化等多个方面,对于希望编写高质量C程序的开发者来说非常实用。遵循这些建议可以帮助开发者编写出更加安全、健壮、高效的代码...

    编写高质量代码改善C#程序的建议读书笔记

    编写高质量代码改善C#程序的建议读书笔记 本文旨在总结编写高质量代码的建议,旨在帮助C#程序员编写高效、可读性强的代码。在本文中,我们将讨论三个重要的建议,包括正确操作字符串拼接、使用默认转型方法和区别...

    高质量java程序设计读书笔记

    本文将基于"高质量java程序设计读书笔记"的主题,深入探讨Java编程中的异常处理以及面向对象编程(OOP)中的继承和组合设计原则。 首先,异常处理是Java程序设计中的重要组成部分,它提供了一种结构化的方式来处理...

    JAVA模式的读书笔记

    总的来说,Java模式是提升代码质量的有效工具,它们可以帮助我们编写更加优雅、可维护的代码,并为软件的长期发展打下坚实的基础。在实际开发中,应结合具体问题灵活运用这些模式,以达到最优的设计效果。

    《Python编程金典》读书笔记

    ### 《Python编程金典》读书笔记知识点梳理 #### 1. 绪论 绪论部分通常会介绍Python的历史背景、特点以及为什么选择Python作为学习和使用的编程语言。此外,还会涉及Python与其他编程语言的区别,以及它在不同领域...

    编写高质量代码 Web前端开发修炼之道 书摘精要

    《编写高质量代码 Web前端开发修炼之道》是一本深入探讨前端开发实践与技巧的书籍,旨在提升Web应用的质量和可维护性。书中强调了遵循Web标准的重要性,这些标准主要分为结构、样式和行为三大部分。 结构标准包括...

    编写高质量IOS的方法

    编写高质量iOS与OS X代码的52个有效的方法][1],这本书非常好,看了很多遍,今天把自己看的,感觉很常用的知识记录下来,就当做是一个简单的读书笔记好了。

    素贞之91建议——进阶读书笔记.pdf

    Python进阶的读书笔记,实际是编写高质量代码:改善Python的九十一个建议; 对于入门后的童鞋来说,读完此书又可以上升一个层次了!

    《C#与.NET3.0高级程序设计》读书笔记

    读书笔记主要涵盖了以下几个方面的内容: 1. C#语言特性:包括匿名方法、lambda表达式、闭包、委托、事件、泛型、LINQ(Language Integrated Query)等。这些特性是C# 3.0及更高版本的核心,极大地增强了代码的...

    python59条代码编辑建议读书笔记

    《Effective Python:编写高质量Python代码的59个有效方法》是Brett Slatkin所著的一本关于Python编程实践的书籍。这本书通过59条具体的建议,深入浅出地介绍了如何提升Python代码的质量和效率。以下是对这59条建议...

    代码整洁之道-----读书笔记

    这本书主要探讨了如何通过编写整洁、易于理解的代码来提高软件的质量和可维护性,尤其针对Java编程语言提供了许多实用的指导原则和技巧。在阅读这本书的过程中,我们可以学到很多关于代码整洁性的关键概念。 1. **...

    Swing读书笔记

    ### Swing读书笔记:深入理解Swing的包与版面结构 #### Swing的常用包解析 Swing作为Java中用于创建图形用户界面(GUI)的主要库,提供了丰富的组件和功能,其核心包及其作用如下: 1. **`javax.swing`**: - 这是...

    PSP读书笔记1

    【PSP读书笔记1】 PSP,全称Personal Software Process,是面向个人的软件开发过程,旨在提升软件工程师的效率和软件质量。该框架通过结构化的方法指导工程师进行自我管理和改进,涵盖了时间管理、计划制定、缺陷...

    C++primer读书笔记

    ### C++ Primer 读书笔记概览 在深入探讨C++ Primer各...通过对本书的深入学习,不仅可以掌握C++的基本和高级特性,还能学会如何编写高质量、可维护的代码。无论是初学者还是有经验的开发者,都能从这本书中获益匪浅。

    Effective C++ Roy T 读书笔记。

    书中的每一项都包含丰富的讨论和示例,指导读者如何写出更高质量的C++代码。通过对这些知识点的掌握,开发者能够提升C++编程的技能,写出更加健壮和高效的程序。阅读Roy T的读书笔记可以帮助我们回顾和巩固这些关键...

    统计学与R读书笔记(第四版)

    2. **数据可视化**:使用ggplot2库创建高质量的图表,包括散点图、直方图、箱线图等,并学习自定义图形元素。 3. **数据导入导出**:如何读取和写入各种格式的数据文件,如CSV、Excel或数据库文件。 4. **R包的...

Global site tag (gtag.js) - Google Analytics