終於翻開這本James都稱讚的java經典書籍了,發現比一般的英語書籍要難懂一些。但是裡面的Item都是非常實用的,是java程式員應該理解的。
Creating and Destroying Object
Item 1:考慮用靜態Factory 方法替代構造器
例如:public static Boolean valueOf(boolean b)
{
return (b?Boolean.TRUE:Boolean.FALSE);
}
這樣的好處是方法有名字,並且它可以複用對象,不像構造器每次調用都產生新的對象。其次它還可以返回傳回型別的子類。不好的地方是如果沒有public or protected構造器的類將不能被繼承。還有就是靜態Factory 方法的名字和其他的靜態方法名字不容易區分。
Item 2:通過添加私人構造器來加強單例屬性(singletom property)
例如:public class Hello
{
private static final Hello Instance = new Hell();
private Hello()
{}
public static Hello getInstance()
{
return Instance;
}
}
這個私人構造器只能在內部被使用,確保了單例模式!
Item 3:避免建立重複的對象
對不可修改的對象盡量進行複用,這樣效率和效能都會提高。例如如果迴圈100次String s = new String("hello")將建立100個對象 迴圈100次String s = "hello";則只建立了一個對象。很好的進行了複用。
Item 4:用私人構造器來避免被執行個體化
例如public UtilityClass
{
private UtilityClass()
{}
///
}
通常那些工具類是這麼設計的
Item 5:消除絕對的對象引用
雖然java中使用gc來管理記憶體,但是如果不注意的話也會產生“記憶體流失”。例如下面的程式
public class Stack
{
private Object[] elements;
private int size = 0;
public Stack(int i)
{
this.elements = new Object[i];
}
public void push(Object e)
{
ensure();
elements[size++] = e;
}
public Object pop()
{
if(size == 0)
{
////
}
return elements[size--];
}
private void ensure()
{
////
}
}
標記的地方存在著記憶體流失的問題,因為當他被彈出棧的時候,它也沒有成為可回收的垃圾對象,Stack維護著他們的絕對的引用。將不能更改。改進的方法是如下的寫法
public Object pop()
{
if(size == 0)
{
////
}
Object obj = elements[--size];
elements[size] = null;
return obj;
}
但是切忌不要濫用null。
Item 6:避免finalizers
記憶體回收行程是低線程層級啟動並執行且不能被強迫執行。推薦使用的方法類似於
InputStream is = null;
try
{
is = /////;
}
finally
{
is.close();
}