从C#到Java(effective-java阅读笔记)

LearnEffectiveJava

介绍

学习EffectiveJava的项目

各个模块

  • staticinstance

    静态方法创建对应的实例

  • iocbuilder

    构造函数注入实现静态工厂、builder等

    可以长期重复使用的对象,建议抽离出来作为静态对象

  • clearstack

    对象自己管理内存的时候,需要手动消除对象的过期引用,请看这里

    避免使用Finalizer以及Clearner。JVM会为每一个Finalizable对象创建一个看门狗(watchdog)。这是Finalizer类的一个实例。而所有的这些看门狗又会为Finalizer类所引用。由于存在这么一个引用链,因此整个的这些对象都是存活的。请看这里

    使用try-catch-finally来释放。

  • 泛型

    java的泛型其实是object,所以需要注意类型转换的问题。比如以下代码:
    T t = new T();
    T[] array = new T[1];
    ps:大概是因为java的泛型是object,所以类似C#的Factory.Create<MyType>();T t = new T();这种是实现不了的,需要在方法参数里面定义class来接收需要转换的泛型类型。关于java的泛型,可以看我之前的这篇博文;

  • 枚举(?)

    Java的枚举很强大,可以添加方法或者继承需要使用的接口。但是在项目中真的需要把业务或者逻辑代码里面携带枚举方法里面吗?

  • Marker Interface

    标记接口表示接口只表示某一特性,比如Java的序列化、Cloneable等。这种应该是一个设计的理念,因为在C#中我也会经常使用。请看这里

  • Lambda

    关于java的lambda,可以看一下我之前的这篇博客;

  • 防御性拷贝

    如果需要一个不能需改内部属性的类,在get方法的时候返回一个new的对象,比如

    public Date getEnd(){
        return new Data(this.end.getTime());
    }
    
  • Optional

    在55章讲了“容器类型,包括集合、映射、Stream、数组和 Optional,不应该封装在 Optional 中。”,如果返回值是容器类型的话不应该用Optional包装;如果返回的是例如Order,User这种业务类型的话,可以考虑用Optional包装起来(本人看法)。

  • 异常处理

    "异常应该只用于异常的情况下;他们永远不应该用于正常的程序控制流程。",书中这样说,有关常见的NPE异常,我们可以用optional包裹起来让调用者进行处理,但是类似谷歌的Preconditions,当前面的expression为false的时候都会抛出IllegalArgumentException,这种适用与业务吗?比起BaseResult.Fail()呢?

  • 一些需要注意的点

    1.包内的static final字段,设置为private并且提供方法返回clone对象。
    2.使用访问方法而不是公共属性。
    3.接口、抽象类 可以看一下我的代码片段1 or 代码片段2

此篇幅为第一次阅读的粗糙笔记,后续还会更新修改一些内容

原文地址:https://www.cnblogs.com/LvJiaXuanBlogs/p/11163418.html