读书笔记--Effective Java 2nd --第二章--创建和销毁对象

 

今天开始看Effective Java 2nd,坚持每天抽大概2小时来看,每天30页左右,看完后写读书笔记。

第二章 创建和销毁对象

       1 考虑用静态工厂方法代替构造器

       此处静态工厂和设计模式中的工厂模式并不能直接对应,设计模式中的工厂模式在《java与模式》中介绍有三种,简单工厂模式,工厂模式,抽象工厂模式。而此处的静态工厂方法可以看做简单工厂模式中工厂角色和产品角色合并后的结果。

       静态工厂方法相对于构造器有3个优势,名称,对实例的控制(单例,多例,或者每次返回新实例),对实例类型的控制(返回子类型)。从名称来说,如果一个类有多个构造器时,有可能我们并不能从参数上来区分开来每个构造器的不同之处,这时带有名称的静态工厂方法就可以明确的说明了。对实例的控制来说,这个也比较容易理解,用构造器实例化对象,每次都是返回的新对象。而静态工厂方法就可以控制返回对象,类似于享元模式。对于返回类型的控制上面来说呢,这个静态工厂方法的返回类型就比较灵活了。说到这里想起在工作当中的一个事情,程序难免会有异常,异常呢一般会在日志中体现出来,但是不可能每天都跑去翻查日志吧。。。所以公司需要将各个应用都吧错误日志发都一个应用上面方便统一查看。其实这个就需要在log4j写日志的时候发一个http请求而已。代码的日志类一般是这样写的:

Private static Log log = LogFactory.getLog(“name”);

也就是用的apache common-logging来实现的,这个就是抽象工厂模式的一个应用了。其实这个就是自定义一个log实现log接口就可以了。然后告诉LogFactory实例化这个log就行了。而这个就体现出静态工厂方法在这方面的一个灵活性了。不用改变接口,就可以实现不同的行为(返回不同的子类型)

还有一个优势在于使用泛型时。在实例化一个泛型的类时通常需要连续两次提供泛型参数。而有了静态工厂方法,编译器可以替你找到类型参数。

2 遇到多个构造器参数时考虑用构建器(builder模式)

对于有多个成员变量的类在实例化的时候需要初始化时,一般还有3种方法,一是采用telescoping constructor模式:

public Constructor(int para1,int para2){

       this(para1,para2,default)

}

public Contructor(int para1,int para2,int para3){

       …//初始化对象

}

第二种是采用JavaBean模式,实例化类后调用对应的set方法设置值。缺点呢,就是在调用方法时对象可能处于不一致的状态(书中原话,不太懂),还有就是暴露出了一些set方法,不能把类做成不可变了。

第三种就是采用builder模式,另外创建一个builder对象,builder对象中有待build对象的参数,设这好builder对象参数后调用builder对象build方法(当然方法名不一定就是这个)就可以生成一个待build对象。Builder模式的缺点你就是需要额外创建一个builder对象,所以在构造器或者静态方法中有多个参数时可以考虑builder模式。

       3 使用枚举类型强化Singleton属性

直接上代码吧:

public  enum ClassName {

       INSTANCE:

      

       public void method(){…}

}

通过调用ClassName.INSTANCE.method() 调用相应方法。

引用书中一句话:单元素的枚举类型已经成为实现Singleton的最佳方法。

4 通过私有构造器强化不可实例化类的能力

这一条其实就是在一些只有static方法的类中显示声明私有构造器(无构造器时有一默认无参构造器)

5 避免创建不必要的对象

有一些不可变类,能重用就重用,而没必要每次都去创建。比如不变的时间。

引用书中一句话:要优先使用基本类型而不是装箱基本类型,要当心无意识的自动装箱

当你想用对象池时要仔细想想到底值得否。

6 消除过期的对象引用

只要类时自己管理内存的时候,就要警惕内存泄露的问题,当使用缓存的时候也要当心内存泄露。缓存应该要定时清理掉无用的项。这里提到了WeakHashMap,弱引用的hashmap,当某个key还有引用时hashmap中就会一直存在,无引用时,在对WeakHashMap操作时put 或者 get ,无引用的key就会被清除掉。

7 避免使用终结方法(finalizer)

finalizer方法是在对象被销毁时触发调用的,但是不同的JVM实现调用的时间点不能保证,很有可能就不会调用。所以需要一般会显示的实现一些终结方法放在try-catch-finallyfinally调用。当然有一些非常关键的资源还是需要在finalizer中释放的,比如关闭文件。而且使用了终结方法后记住调用super.finalize(),还有就是防止子类未调用super.finalize()时可考虑使用终结方法守卫者(finalizer guardian).

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
R语言实战笔记第九章介绍了方差分析的内容。方差分析是一种用于比较两个或多个组之间差异的统计方法。在R语言中,可以使用lm函数进行方差分析的回归拟合。lm函数的基本用法是: myfit <- lm(I(Y^(a))~x I(x^2) I(log(x)) var ... [-1],data=dataframe 其中,Y代表因变量,x代表自变量,a代表指数,var代表其他可能对模型有影响的变量。lm函数可以拟合回归模型并提供相关分析结果。 在方差分析中,还需要进行数据诊断,以确保模型的可靠性。其中几个重要的诊断包括异常观测值、离群点和高杠杆值点。异常观测值对于回归分析来说非常重要,可以通过Q-Q图和outlierTest函数来检测。离群点在Q-Q图中表示落在置信区间之外的点,需要删除后重拟合并再次进行显著性检验。高杠杆值点是指在自变量因子空间中的离群点,可以通过帽子统计量来识别。一般来说,帽子统计量高于均值的2到3倍即可标记为高杠杆值点。 此外,方差分析还需要关注正态性。可以使用car包的qqplot函数绘制Q-Q图,并通过线的位置来判断数据是否服从正态分布。落在置信区间内为优,落在置信区间之外为异常点,需要进行处理。还可以通过绘制学生化残差的直方图和密度图来评估正态性。 综上所述,R语言实战第九章介绍了方差分析及其相关的数据诊断方法,包括异常观测值、离群点、高杠杆值点和正态性检验。这些方法可以用于分析数据的可靠性和模型的适应性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [R语言实战笔记--第八章 OLS回归分析](https://blog.csdn.net/gdyflxw/article/details/53870535)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值