转载

Java 重写方法与初始化的隐患

前言

drakeet写了个和 RecyclerView 相关的 GenerousRecyclerView , 原文 提到了写这个的目的. 因为需要知道ViewGroup的clipToPadding属性, 所以调用了 ViewGroup.getClipToPadding , 但这个方法是API level 21引入的. 我看了一下代码, ViewGroup是通过调用setClipToPadding完成相关内容初始化的, setClipToPadding在API level 1就有了, 也就是说我们只要监视setClipToPadding的调用, 就能知道ViewGroup的clipToPadding状态. 如此巧妙, 如果我告诉drakeet, 说不定就能引起他的注意, 出任CEO, 走上人生巅峰.

Java 重写方法与初始化的隐患

如果你已经知道我要说什么了, 可以鄙视我.

问题

简单还原一下问题, 我们有一个类SuperClass

  1. public   class  SuperClass { 
  2.  
  3.      private   int  mSuperX; 
  4.  
  5.      public  SuperClass() { 
  6.         setX( 99 ); 
  7.     } 
  8.  
  9.      public   void  setX( int  x) { 
  10.         mSuperX = x; 
  11.     } 

现在我们想随时知道 mSuperX 是什么值, 不用反射, 因为父类从不直接修改mSuperX的值, 总是通过 setX 来改, 那么最简单的方法就是继承SuperClass, 重写setX方法, 监听它的改变就好.下面是我们的子类SubClass:

  1. public   class  SubClass  extends  SuperClass { 
  2.  
  3.      private   int  mSubX =  1
  4.  
  5.      public  SubClass() {} 
  6.  
  7.      @Override  
  8.      public   void  setX( int  x) { 
  9.          super .setX(x); 
  10.         mSubX = x; 
  11.         System.out.println( "SubX is assigned "  + x); 
  12.     } 
  13.  
  14.      public   void  printX() { 
  15.         System.out.println( "SubX = "  + mSubX); 
  16.     } 

我使用 mSubX 来跟踪 mSuperX

正文到此结束
Loading...