重构36计(31-36)
第三十一计:置空不用的对象
在C++中,销毁一个对象后,一定要把指针置为NULL,否则会出现野指针,最好写成下面这样,delete后立马置为NULL,
delete pObject;
pObject = NULL;
在Java中,当不再需要一个对象时,最好能把它置为null,这样有利于垃圾回收。
第三十二计:善于利用接口
1、 回调型接口
在C语言中,回调函数可以通过函数指针来实现,Java中没有指针的概念,可以利用接口来达到同样的目的,例如:
public interface Callback{ public void onChanged(); } public void execute(Callback callback){ ... callback.onChanged(); ... }
public interface Millionaire{ } public class Member extends User implements Millionaire{ ... } public boolean check(User user){ if(user instanceOf Millionaire) // 这是百万富豪,直接让它pass return true; ... }
public interface DataAware{ public void setData(Data data); } public interface DataBaseConnectionAware{ public void setConnection(Connection conn); } // 用户服务类 public class UserService extends Service implements DataAware,DataBaseConnectionAware{ public void setData(Data data); public void setConnection(Connection conn); } // 创建服务对象 public Service createService(int type){ Service service = null; if(type == USER){ service = new UserService(); if(service instanceOf DataAware) // 如果它想要数据,则注入数据对象 ((DataAware)service).setData(data); if(service instanceOf DataBaseConnectionAware) // 如果它想要数据库连接,则注入连接对象 ((DataBaseConnectionAware)service).setConnection(conn); return service; }
public class Shape{ private int type; public void draw(){ if(type == 0) // 如果是矩形 drawRect(); else if(type == 1) // 如果是圆形 drawCircle(); else if(type == 2) // 如果是直线 drawLine(); } public boolean isPointIn(float x, float y){ if(type == 0) // 如果是矩形 return isPointInRect(x,y); else if(type == 1) // 如果是圆形 return isPointInCircle(x,y); else if(type == 2) // 如果是直线 return isPointInLine(); return false; }}
public abstract class Shape{ public abstract void draw(); public abstract boolean isPointIn(x,y);}public class Circleextends Shape{ public void draw(){ drawCircle(); } public abstract boolean isPointIn(x,y){ isPointInCircle(x,y); }}public class Rect extends Shape{ public void draw(){ drawRec(); } public abstract boolean isPointIn(x,y){ isPointInRect(x,y); }}public class Line extends Shape{ public void draw(){ drawLine(); } public abstract boolean isPointIn(x,y){ isPointInLine(x,y); }}