一.创建和销毁对象
Item1:使用静态工厂方法替代构造器
代码:
public class Apple {
private String color;
//构造器方式实现创建对象
public apple(String color) {
this.color = color;
}
//一个静态工厂方法
public static Apple colorOf(String color) {
return new Apple(color);
}
}
- 优势1:静态工厂方法有名称,可以传达更多信息,而构造器都一样,无法从名称看出区别
class Apple{
private String color;
private int weight;
private boolean fresh;
//调用方仅仅从构造方法名上无法区分出几个构造器的区别
public Apple(String color) {
this.color = color;
}
public Apple(String color, int weight) {
this.color = color;
this.weight = weight;
}
public Apple(String color, int weight, boolean fresh) {
this.color = color;
this.weight = weight;
this.fresh = fresh;
}
//调用方可以直接通过静态方法名来得知我创建的这个对象有什么属性
public static Apple buildWithColor(String color) {
return new Apple(color);
}
}
-
优势2: 静态工厂方法不用在每次调用时都创建一个对象
-
优势3: 静态工厂方法可以返回子类型
-
优势4:返回的类可以根据参数的不同而不同
-
优势5:没看太懂
-
todo
但是刚刚在开发时候发现,大对象不适合使用静态工厂方法。大对象是需要先new一个对象再往里面塞值的。此处可以再探讨
Item8 避免使用终结方法和清洁方法
原因一:终结方法和清除方法不能保证被及时地执行,从一个对象变得不可达,到终结方法执行,这段时间是任意长的。举例用的是文件关闭。由于终结方法是不能及时执行的,这样会导致很多,你以为关了的文件没有关闭,导致大量文件仍然保持在打开状态,而文件描述符是一种很有限的资源。
原因二:终结方法和清除方法不仅不能保证被及时执行,也不能保证一定能被执行,比如被回收的对象里的终结方法。不应该依赖终结/清除方法来更新重要的持久状态。
原因三:终结方法和清除方法带来性能损耗高。使用终结方法比不使用耗时高达50倍
原因四:安全问题,为终结方法攻击打开了类的大门。细节没看懂。
如果类的对象中封装的资源确实需要终止,让类实现AutoClosable。客户端在每个实例不需要的时候,调用close方法。利用try-with-resources.
Item9 使用try-with-resources 而不是try-finally
java类库中有很多方法需要调用close方法来手动关闭资源。如InputStream,OutputStream和java.sql.Connection。
为啥InputStream需要手动调用close方法?
找到官网docs
https://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html#close()
Closes this input stream and releases any system resources associated with the stream.
关闭输入流,释放分配给这个流的任意系统资源。
找到一篇博客:https://www.modb.pro/db/165515
里面大概讲了下,close方法,释放的是文件描述符,是指向这个文件的指针,如果没有close方法,这个文件描述符一直都不会被删除,即使gc也不会,除非是整个jvm停止运行。
另外还有一篇博客,讲的是如果不close造成的资源泄漏
https://blog.csdn.net/whbing1471/article/details/112740624
这两篇都还没有跟着去尝试一遍,todo。
继续学习
//使用try-finally的情况
static String firstLineOffFile(String path) throws IOException {
BufferedReader br = new BufferedReader(new FileReader(path));
try {
return br.readLine();
} finally {
br.close();
}
}
还举了一个例子是创建了两个资源的情况
todo
接下来作者说了要使用try-with-resources语法,但是我之前不知道这个语法。照例贴下官网地址
https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html