簡體   English   中英

Java靜態變量用於數據存儲與本地

[英]Java Static Variables for Data Storage vs Local

我用動物代替了我的真實代碼,因此看起來有些愚蠢,但這是一個真實的問題。

我的java程序獲取一張不同動物的列表,並一次對它們進行遍歷,每一個都執行以下操作:創建動物,對動物進行一些隨機運動,對每個運動進行計數,然后程序收集運動數據,進行一些分析然后轉到列表中的下一個動物。

我有一個抽象的動物類,由不同的動物對象(狗,貓等)擴展,每個對象都有自己的動作。 在該基本動物類中,有一個HashMap用來計算動物的隨機運動。

每個移動方法都以對動物基類中的updateMap的調用結尾。 updateMap接收動作String鍵作為輸入,然后檢查給定的動作是否在HashMap中作為鍵,如果不是,則將動作添加為鍵,值為1。如果該動作已經在HashMap中為鍵它將增加數字值。

當前設置是HashMap在Animal類中,因此每個Animal都有自己的。 我的問題是,將HashMap作為帶有靜態updateMap方法的靜態變量移動到單獨的實用工具類中是否違反Java最佳實踐? 當我想要運動數據時,我將不得不添加一個getter方法來調用,以及一個清除將在Animal構造函數中調用的地圖的方法。 一次只對動物進行一次迭代,並且只進行一次,因此更新不會發生沖突。

我想要創建靜態實用程序類的原因是希望它可以提高性能。 動物列表上有數百萬個項目,如果沒有必要使用此HashMap作為類變量來創建每個動物,我認為我可以將其加快一點(即使它很少引起注意)。 但是我不知道對靜態方法的調用是否會減慢它的速度。 如果對此有任何意見,以及您知道更好的(性能方面)設計來跟蹤運動,將不勝感激。

偽代碼:

當前:

動物.java

 public abstract class Animal {
      private HashMap counter;

      public Animal(String input){
           counter = new HashMap();
           .
           .
      }

      protected void updateMap(String key){
           if(counter.contains(key)){
                counter.update(key, counter.get(key)+1);
           } else {
                counter.add(key, 1);
           }
      }

      protected void analyze(){
           some code using counter;
      }
 }

狗.java

 public class Dog extends Animal {

      public Dog(String input){
           super(input);
      }

      private void jump(){
           .
           .
           updateMap("jump");
      }

      private void run(){
           .
           .
           updateMap("run");
      }

      private void dance(){
           .
           .
           updateMap("dance");
      }

更改:

動物.java

 public abstract class Animal {

      public Animal(String input){
           AnimalUtil.clearCounter();
           .
           .
      }

      protected void analyze(){
           HashMap count = AnimalUtil.getCounter();
           some code using counter;
      }
 }

狗.java

 public class Dog extends Animal {

      public Dog(String input){
           super(input);
      }

      private void jump(){
           .
           .
           AnimalUtil.updateMap("jump");
      }

      private void run(){
           .
           .
           AnimalUtil.updateMap("run");
      }

      private void dance(){
           .
           .
           AnimalUtil.updateMap("dance");
      }
 }

AnimalUtil.java

 public class AnimalUtil {
      private static HashMap counter;

      public static void updateMap(String key){
           if(counter.contains(key)){
                counter.update(key, counter.get(key)+1);
           } else {
                counter.add(key, 1);
           }
      }

      public static HashMap getCounter(){
           return counter;
      }

      public static void clearCounter(){
           counter = new HashMap();
      }
 }

謝謝。

一個問題要問自己:每個動物都有自己的HashMap是否有意義? 聽起來答案是否定的,因為這是“共享”數據,即“全局”數據。

將其static變量是合理的。 我建議還考慮其他選擇。 例如,聽起來好像HashMap存儲有關動物生活的世界的信息。 因此,此變量可能屬於另一個類WorldFarm ,而不是Animal類。

問題是,創建實用程序類的大多數時間是因為您不知道其中包含的代碼的責任。 根據“干凈代碼”,所有語言的最佳做法是,您編寫的每一個和平代碼都有其自己的領域和職責。 因此,將您要全局使用的HashMap放在一個負責計算和觀察不同動物運動的類中。 那是我的建議。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM