• Use final liberally


     
    Use the final keyword liberally to communicate your intent.

    The final keyword has more than one meaning:

    • final class cannot be extended
    • final method cannot be overridden
    • final fields, parameters, and local variables cannot change their value once set
    In the last case, "value" for primitives is understood in the usual sense, while "value" for objects means the object's identity, not itsstate. Once the identity of a final object reference is set, it can still change its state, but not its identity (that is, you can't re-point the object reference to some other object).

    Declaring primitive fields as final automatically ensures thread-safety for that field.

    Some habitually declare parameters as final, since this is almost always the desired behaviour. Others find this verbose, and of little real benefit.

    Consistently using final with local variables (when appropriate) can be useful as well. It brings attention to the non-final local variables, which usually have more logic associated with them (for example, result variables, accumulators, loop variables). Many find this verbose. A reasonable approach is to occasionally use final for local variables, but only if there is some unusual condition, whereby making final explicit can call attention to at least one non-final local variable in the method; this serves to quickly distinguish the non-final local variables from the others.

    Using final:

    • clearly communicates your intent
    • allows the compiler and virtual machine to perform minor optimizations
    • clearly flags items which are simpler in behaviour - final says, "If you are looking for complexity, you won't find it here."
    Example 
    import java.util.*;
    import java.lang.reflect.Field;
    
    /** This class cannot be extended, since it's final. */
    public final class Boat {
    
      public Boat(final String aName, final int aLength, final Date aDateManufactured){
        fName = aName;
        fLength = aLength;
        //make a defensive copy of the date
        fDateManufactured = new Date(aDateManufactured.getTime());
    
        //does not compile, since the items are final:
        //aDateManufactured = null;
        //aLength = 0;
      }
    
      /** Cannot be overridden, since the class itself is final. */
      public void setDate(final Date aNewDate){
        //even though the field is final, its state can change:
        fDateManufactured.setTime(aNewDate.getTime());
    
        //does not compile, since field is final:
        //fDateManufactured = aNewDate;
      }
    
      /** Return the highest race score. */
      public Integer bestRaceScore(){
        //the result reference can't be final, since it can be 
        //re-pointed to different objects
        Integer result = Integer.valueOf(0); 
        //final Integer result = Integer.valueOf(0); //doesn't compile
        
        //this example is artificial, since fRaceScores could be 
        //referenced directly here...
        final List<Integer> scores = fRaceScores;
        for(Integer score : scores){
          if (score > result){
            result = score; //re-point to the max value
          }
        }
        return result;
      }
      
      //..elided
    
      // PRIVATE
      private final String fName;
      private final int fLength;
      private List<Integer> fRaceScores = new ArrayList<>();
      private final Date fDateManufactured;
    }  
    

      

  • 相关阅读:
    近似与精确——《狂人C》习题解答15(第三章习题5)
    策略、次序和测试—《狂人C》习题解答16(第三章习题6)
    华丽的递归——将正整数表示为平方数之和
    Horner's rule——《狂人C》习题解答5(第二章习题8)
    .NET牛人需要了解的问题[转]
    Ajax的一个封装[原创]
    公司项目改进之权限篇[原创]
    【方案解决】ncelab: *E,CUIOCP Outofmodule reference terminating in a VHDL scope is not allowed
    【原创】关于setup和hold的深入浅出【Verilog】
    LEC3南京大学操作系统重点简答题素材中断处理
  • 原文地址:https://www.cnblogs.com/hephec/p/4579573.html
Copyright © 2020-2023  润新知