Effective-Java
文章平均质量分 91
Effective-Java
developer@liyong
GISer
展开
-
Effective-Java-Chapter11-并发
当多个线程共享可变数据时,每个读取或写入数据的线程都必须执行同步。在缺乏同步的情况下,不能保证一个线程的更改对另一个线程可见。同步共享可变数据失败的代价是活性失败和安全失败。这些工具只是对调度器的提示。线程优先级可以少量地用于提高已经工作的程序的服务质量,但绝不应该用于「修复」几乎不能工作的程序。作为规则,你应该在同步区域内做尽可能少的工作。更一般地说,将你在同步区域内所做的工作量保持在最小(也是降低锁的粒度)。注解什么是外来方法:通常指的是在一个线程或同步区域中调用另一个线程或不同同步区域的方法。转载 2024-08-21 17:54:33 · 30 阅读 · 0 评论 -
Effective-Java-Chapter10-异常
通过抛出一个 checked 的异常,你可以强制调用者在 catch 子句中处理异常,或者将其传播出去。只有当在失败的情况下,提供的信息不充分时,你才应该抛出一个 checked 异常。如果一个方法声明抛出受检异常,则调用该方法的代码必须要么捕获这个异常,要么在其方法签名中声明抛出此异常。定义:运行时异常是在运行时发生的异常,编译器不会强制要求处理这些异常。没啥好说的,意思就是可以使用定义好的标准异常,当然我们也可以自定义标准异常。高层应该捕获低层异常,并确保抛出的异常可以用高层抽象解释。原创 2024-08-20 17:53:17 · 902 阅读 · 0 评论 -
Effective-Java-Chapter9-通用程序设计
书中这个例子,是一个接口,但是具体的实例却是由反射进行创建的,并且类的名称是通过参数类确定了,这就是反射结合接口的最佳实践。同时这个实践是我们不确定类型的时候,也就是说如果我们确定了类型,最好是使用接口直接引用,因为反射有自己的缺陷。我们可以看到第二个while循环引用了上面的变量I但是我们实际上的期望是引用i2所以不符合预期,产生bug,如果我们使用传统的for,我们引用不到i这个变量。第二,基本类型只有全功能值,而每个包装类型除了对应的基本类型的所有功能值外,还有一个非功能值,即 null。原创 2024-08-20 16:58:10 · 988 阅读 · 0 评论 -
Effective-Java-Chapter8-方法
与返回基本数据类型相比,返回包含包装类的 Optional 类型的代价高得惊人,因为 Optional 类型有两个装箱级别,而不是零。这句话显而易见,我们使用Optional是为了避免空指针的问题,但是直接返回空那还需要Optional 做什么呢。你应该简单的返回一个空的 List,而不是一个空的 Optional。这个准则告诉我们如果我们对象中的数据是不可变的,那我们我们一定要保证它一定不可变,不能破坏它。这样外面的怎么操作都是在副本上操作,绝对不会影响到我们真正的数据,保证了数据的安全性。原创 2024-08-20 15:25:29 · 564 阅读 · 0 评论 -
Effective-Java-Chapter7-λ表达式和流
Collection 接口是 Iterable 的一个子类型,它有一个流方法,因此它提供了迭代和流两种访问方式。流范式中最重要的部分是将计算构造为一系列转换,其中每个阶段的结果都尽可能地接近上一阶段结果的纯函数。纯函数的结果只依赖于它的输入:它不依赖于任何可变状态,也不更新任何状态。流管道的计算是惰性的:直到调用 Terminal 操作时才开始计算,并且对完成 Terminal 操作不需要的数据元素永远不会计算。如果你并行的每个流没有依赖关系就可以使用,也就是说每个流的结果是相互独立的,是不具有状态的。原创 2024-08-19 10:25:12 · 849 阅读 · 0 评论 -
Effective-Java-Chapter6
你可能听过一个说法:标记接口已经过时,更好的方式是标记注解(Item-39)。这个言论是错误的。与标记注解相比,标记接口有两个优点。首先,标记接口定义的类型由标记类的实例实现;标记注解不会。标记接口类型的存在允许你在编译时捕获错误,如果你使用标记注解,则在运行时才能捕获这些错误。例如序列化是个标记接口,这样如果流在写对象的时候,可以判断这个是否实现了Serializable,这个是在编译的时候就能做到的。对比:使用标记注解的情况。原创 2024-08-17 11:10:36 · 674 阅读 · 0 评论 -
Effective-Java-Chapter5-泛型
因为这样存在类型安全,假如第一步中的创建是合法的,那么由于前面提到的sub[] 和 super[]存在父子关系,所以第三步是合法的,那么在第四步我们这个操作完全没毛病吧,反正是一个对象类型的数组都可以存,但是使用的时候这就报错了ClassCastException。我们不能确定具体是什么类型,但可以确定它一定是Number的一个子类。这样是不是更通用了,答案是如果你还是像上面那样使用,编译通不过,问题就在于你传入的是List《String》,但是往里面添加的元素却是Object类型,类型是不匹配的。原创 2024-08-13 13:36:15 · 1025 阅读 · 0 评论 -
Effective-Java-Chapter4
当一个类实现了一个接口时,这个接口作为一种类型,可以用来引用类的实例。因此,实现接口的类应该说明使用者可以对类的实例做什么。为其他任何目的定义接口都是不合适的。在实践中我们往往会将一些常量放到接口中,但是书中作者似乎更推荐我们把常量放到类中。原创 2024-08-07 13:46:59 · 963 阅读 · 0 评论 -
Effective-Java-Chapter3
传递性:对于任何非空的引用值 x, y, z,如果 x.equals(y) 返回 true,y.equals(z) 返回 true,那么 x.equals(z) 必须返回 true。一致性:对于任何非空的引用值 x 和 y, x.equals(y) 的多次调用必须一致地返回 true 或一致地返回 false,前提是不修改 equals 中使用的信息。对称性:对于任何非空参考值 x 和 y,x.equals(y) 必须在且仅当 y.equals(x) 返回 true 时返回 true。原创 2024-08-05 14:53:44 · 768 阅读 · 0 评论 -
Effective-Java-Chapter2
如果说我们这个函数调用的比较频繁,就会创建大量的对象,可能会增加monitor GC的频率,影响性能。比如说这个类,我们要检查单词拼写的正确性,我们需要一个参考标准,而这个标准就是Lexicon这个字典,这样写代码好像貌似完全可行。这个准则更适合应用在我们使用的对象可以复用并且创建它的成本是比较大的,如果成本可以忽略不计也没有必要。这个准则主要是由于,有的时候我们这类的作用仅仅是将一些通用的方法聚集在一起,比如我们这个方法是工具类。差距既然如此之大,原因就在于使用包装类创建了很多不必要的对象。原创 2024-08-04 15:38:45 · 1073 阅读 · 0 评论