2013-08-29 152 views
0

我要訪問的變量sTerminalId & sTransactionId在類ServerThread傳遞變量值

public class ServerThread extends Thread { 

    /* Some Code Omitted Here */ 

    public void run() { 
      String sDataFromPOS=""; 
      //Get Some Value in sDataFromPOS 
      byte[] bSendToPOS = SAXHandler.ParseXMLToString(sDataFromPOS.toString().substring(2)); 
    } 
} 

public class SAXHandler extends DefaultHandler { 

    static String sTerminalId = ""; 
    static String sTransactionId = ""; 

    public static byte[] ParseXMLToString(String sXMLData) throws Throwable { 
     /* Do Some Operation on String sXMLData & extarct value of sTerminalId & sTransactionId*/ 
    } 
} 

我想什麼是

SAXHandler.sTerminalId 

會得到我的價值,但只爲一個運行如果再次運行,它會給我以前的值。 有沒有其他的選擇?我正在處理敏感數據,所以不想弄亂我的代碼

+2

創建對象,並使用它 –

+0

如果你不想變量的值被覆蓋,不要讓它們變成靜態的!特別是因爲你使用的是多線程 –

+1

如果你想保持ParseXMLToString方法是靜態的,那麼返回的對象具有byte [],sTerminalId和sTransactionId這個方法 –

回答

5

這就是靜態爲什麼不好。使變量實例變量併爲每個運行時創建一個新的對象實例(讓我們忽略了簡單的封裝):

public class ServerThread extends Thread { 
    public void run() { 
     String sDataFromPOS=""; 
     //Get Some Value in sDataFromPOS 
     SAXHandler handler = new SAXHandler(); 
     byte[] bSendToPOS = handler.parseXMLToString(sDataFromPOS.toString().substring(2)); 
     handler.sTerminalId .... // access instance variables 
    } 
} 

public class SAXHandler extends DefaultHandler { 
    String sTerminalId = ""; 
    String sTransactionId = ""; 

    public byte[] parseXMLToString(String sXMLData) throws Throwable { 
     /* Do Some Operation on String sXMLData & extarct value of sTerminalId & sTransactionId*/ 
    } 
} 
+0

因此,如果創建類的對象並調用線程內的非靜態方法是好的嗎?它比靜態方法有什麼優勢嗎? – Shaggy

+1

使用靜態意味着所有的胎面實例共享相同的變量,我認爲這不是你想要的。通常,線程應儘可能少地分享狀態。在線程內創建對象非常普遍,所以不用擔心。 –

0

重新初始化變量再加工前......像

public static byte[] ParseXMLToString(String sXMLData) throws Throwable { 

    sTerminalId = ""; 
    sTransactionId = ""; 

    } 
+0

這是否是一種最合法的方式? – Shaggy

+1

是的,這是正確的,工作....但最好是使用噪音建議的方式在約崗位 –