2015-06-03 101 views
-4

我有這個Java類,我正在編寫應用覆蓋的代碼。我想知道如果使用ENUM是合適的,或者如果我需要使用開關盒,我該如何使用它?此外,我有for循環,我需要使用每個覆蓋類型的常見代碼塊。除此之外,我確實有幾個單獨的字段,我需要爲每個覆蓋類型編碼。Java中的枚舉開關

public class EWFMService 
    { 
    private WorkbrainSystemAccessService wsa = new WorkbrainSystemAccessService(); 

private static final org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(EWFMService.class); 
private final static String ovrCalcGrp = "ovrCalcGrp"; 
private DBConnection conn = null; 
private int empId; 
private Date ovrDate; 
private String ovrTime; 
private String ovrAction; 



public List<EWFMServiceData> getProcessEWFMOverrides(String userName, String password, List<EWFMServiceInputData> inputData) 
throws WSApplicationException{  

    logger.debug("EWFM Service");  
    wsa.logOn(userName, password);  

    List<EWFMServiceData> returnList = new ArrayList<EWFMServiceData>(); 
    logger.debug("userName = " + userName); 

    DBConnection conn = null; 
    PreparedStatement ps = null; 
    ResultSet rs = null; 

    try{ 
     conn = new DBConnection(ConnectionManager.getConnection()); 

    for (int i = 0; i < inputData.size(); i++) 
    { 

在這裏,我想從數據庫中檢索EMP_ID,值存儲在一個變量,可以使用變量在我的程序的其餘部分。我該怎麼做?要檢索emp_id,我正在使用以下查詢。

 conn = new DBConnection(ConnectionManager.getConnection()); 
     String sql = "SELECT EMP_ID FROM EMPLOYEE_HISTORY" 
       + " WHERE EMP_VAL2 = **This is where I want to use the variable in which the values of emp_id will be stored. There can be more than 100 emp_ids**" 
       + " AND SYSDATE BETWEEN EMPHIST_START_DATE AND  EMPHIST_END_DATE"; 


     EWFMServiceInputData inData = (EWFMServiceInputData) inputData.get(i); 
     OverrideType ot = OverrideType.getOverrideType(inData.getRecordType()); 
     logger.debug("override type = " + ot.toString());   
     logger.debug("inputData ["+i+"] = " + inData.toString()); 

     OverrideAccess oa = new OverrideAccess(conn); 
     OverrideData ovr = new OverrideData(); 
     ovr.setOvrUdf4(inData.getReferenceId().toString()); 
     if (ovrAction.equals("APPLY")) { 
      ovr.setOvrStatus(OverrideData.PENDING); 

這裏我想確定Action。如果是Apply,那麼我需要找出recordType。因此,基本上使用if else語句或枚舉來爲每個recordType分支它,因爲我相信switch不支持我正在使用的Java 1.5。然後,對於每個recordType,我分出並寫入與該recordType對應的相應代碼。如果操作取消,那麼我只寫下面的代碼。

 } else if (ovrAction.equals("CANCEL")) { 
      String sql = "SELECT * FROM OVERRIDE" 
        + " WHERE OVR_UDF4 = ?" 
        + " AND OVRTYP_ID = ?"; 
      ps = conn.prepareStatement(sql); 
      rs = ps.executeQuery(); 

      while (rs.next()); { 
       ovr.assignByName(rs); 
       ovr.setUpdated(false); 
       ovr.setRetrieved(true); 
       ovr.setOvrStatus(OverrideData.CANCEL); 
       oa.save(ovr);         
      } 
     }   
     ovr.setEmpId(empId); 
     String strOvrDate = inData.getOvrStartDate(); 

     ovr.setOvrStartDate(DateHelper.parseDate(strOvrDate, "MM/dd/yyyy")); 


     if (ovrStartTime != null) { 
      ovr.setOvrStartTime(ovrTime); 
     } 
     Object ovrEndDate; 
     if (ovrEndDate != null) { 
      ovr.setOvrEndDate(ovrDate); 
     } 
     Object ovrEndTime; 
     if (ovrEndTime!= null) { 
      ovr.setOvrEndTime(ovrTime); 
     } 
     ovr.setOvrComment(inData.getOvrComments()); 
     ovr.setWbuName(inData.getWbuName()); 
     ovr.setWbuNameActual(inData.getWbuNameActual()); 
     ovr.setOvrNewValue("VAC"); 
     ovr.setOvrCreateDate(new Date()); 
     ovr.setOvrtypId(103); 
     oa.insert(ovr); 
     RuleEngine.runCalcGroup(conn, 
       empId, 
       ovrDate, 
       ovrDate); 
     //COMMON BLOCK ENDS HERE 
     EWFMServiceData outData = new EWFMServiceData(); 
     outData.setReferenceId(inData.getReferenceId());    

     String [] status = {"SUCCESS", "ERROR", "LOCKED", "EXCEPTION"}; 
     Random ran = new Random(); 
     String gen = status[ran.nextInt(status.length)]; 
     logger.debug("Status is" + status); 
     outData.setStatus(gen);   
     if (gen.equals("SUCCESS")){ 
     outData.setErrorDetails(""); 
     } else if (gen.equals("ERROR")) { 
      outData.setErrorDetails("Usage of time code VAC is not allowed; balance is insufficient." + " error"); 
     } else if (gen.equals("LOCKED")) { 
      outData.setErrorDetails("Timesheet cannot be edited because it is locked for payroll close." + "locked"); 
     } else if (gen.equals("EXCEPTION")) { 
      outData.setErrorDetails("{ML}QR_INCORRECT_CONDITION_PARAMETER{/ML}Error in condition AWA Is Self Override Condition: java.lang.NullPointerException{ARGS}AWA Is Self Override Conditionjava.lang.NullPointerException{/ARGS" + "exception"); 
     } 
     returnList.add(outData); 
    } 
    }catch (Exception e){ 
    logger.error("Error occured",e); 
    throw new WSApplicationException("Error retrieved",e); 
}finally{ 
    SQLUtil.cleanUp(conn, ps, rs); 
} 

    wsa.logOff(); 

    logger.debug("inputData+ "); 

    return returnList; 

} 



    // I need to know if writing enum is okay or can I just write a switch case above in the for loop and branch each override type and declare their individual variables there? What's the best way? Can someone help me with the code? 
    public enum OverrideType { 
    WORKDETAIL, 
    WORKPREMIUM, 
    EMPLOYEESCHEDULE, 
    EMPLOYEE; 

    public static OverrideType getOverrideType(String recordType) { 
     if(recordType == null) { 
      throw new IllegalArgumentException("Record Type cannot be null"); 
     } 
     if(recordType.equals("Work Detail")) { 


      return WORKDETAIL; 

     } else if (recordType.equals("Work Premium")) { 
      return WORKPREMIUM; 
     } else if (recordType.equals("Schedule")) { 
      return EMPLOYEESCHEDULE; 
     } else if (recordType.equals("Shift Pattern")) { 
      return EMPLOYEE; 
     } else { 
      throw new IllegalArgumentException("Record Type cannot be" + recordType); 
     } 
    } 

    } 

    } 

其他字段我需要包括如下:

  1. FOR WORKDETAIL,我需要使用發送客戶端格式時間碼。
  2. 對於工作溢價,我需要使用由客戶發送的格式的時間碼,而另一個字段只有幾分鐘時間,同時也給客戶端發送的分鐘數。
+0

好帖子提示:(1)不要將問題標爲緊急。志願者會在閒暇時回答他們,你的問題並不比別人更重要; (2)不要使用全部大寫字母,因爲它被廣泛認爲是喊叫; (3)校對你的問題,確保代碼格式正確。謝謝。 – halfer

回答

2

一般來說,使用枚舉是適當的,特別是如果你有一組定義的可能類型。

您還可以添加行爲的枚舉,它可以使你的枚舉稍微更復雜:

public enum OverrideType { 
     WORKDETAIL("Work Detail"), 
     WORKPREMIUM("Work Premium"), 
     EMPLOYEESCHEDULE("Schedule"), 
     EMPLOYEE("Shift Pattern"); 

     private String identifier; 

     private OverrideType(String identifier){ 
      this.identifier = identifier; 
     } 

     public static OverrideType getOverrideType(String recordType) { 

      if(recordType == null) { 
       throw new IllegalArgumentException("Record Type cannot be null"); 
      } 

      for (OverrideType ot : OverrideType.values()) { 
       if (recordType.equals(ot.identifier)) { 
        return ot; 
       } 
      } 

      return null; 
     } 
} 

下面的示例演示如何使用枚舉或抽象的方法定義的接口:

public enum OverrideType implements OverrideTypeIF { 
    WORKDETAIL("Work Detail") { 
     public int getKey() { 
      return 0; 
     } 
    }, 
    WORKPREMIUM("Work Premium") { 
     public int getKey() { 
      return 0; 

     } 
    }, 

    EMPLOYEESCHEDULE("Schedule") { 
     public int getKey() { 
      return 0; 

     } 
    }, 
    EMPLOYEE("Shift Pattern") { 
     public int getKey() { 
      return 0; 
     } 

     public void myInterfaceMethod() { 
      // do type specific behavior 
     } 
    }; 

    private String identifier; 

    private OverrideType(String identifier){ 
     this.identifier = identifier; 
    } 

    public abstract int getKey(); 

    public void myInterfaceMethod() { 
     // do default behavior 
    } 

    public static OverrideType getOverrideType(String recordType) { 

     if(recordType == null) { 
      throw new IllegalArgumentException("Record Type cannot be null"); 
     } 

     for (OverrideType ot : OverrideType.values()) { 
      if (recordType.equals(ot.identifier)) { 
       return ot; 
      } 
     } 

     return null; 
    } 
} 

public interface OverrideTypeIF { 
    void myInterfaceMethod(); 
} 
+0

我對Java相當陌生..你介意如何使用枚舉部分上面的代碼嗎?我可以在那裏使用開關併爲每種覆蓋類型創建一個案例嗎?在每種情況下,我可以在保持通用代碼相同的情況下編寫自己的字段,並在這些情況下使用它的引用? – codejava

+0

我不完全清楚,你的意思。 –

+0

@codejava:您可以實現接口或定義抽象方法,並針對每個枚舉條目專門覆蓋/實現它們。我延伸了我以前的答案,所以請看看。 –