用于数据存储的Java静态变量与本地

时间:2018-01-19 16:27:53

标签: java inheritance static abstract extends

我用动物替换了我的真实代码,所以看起来有点傻但这是一个真正的问题。

我的java程序获取不同动物的列表,并逐个迭代它们,每次执行以下操作:创建动物,动物做一些随机动作,计算每个动作,然后程序收集动作数据,进行一些分析并继续列表中的下一个动物。

我有一个抽象的动物类,它由不同的动物物体,狗,猫等扩展,每个都有自己的动作。在该基础Animal类中,有一个HashMap可以计算动物的随机动作。

每个移动方法以调用updateMap结束,该调用位于Animal基类中。 updateMap接收移动String键作为输入,然后检查给定的移动是否在HashMap中作为键,如果不是,则将移动添加为键,值为1.如果移动已经是HashMap中的键它会增加数值。

当前的设置是HashMap在Animal类中,因此每个Animal都有自己的。我的问题是,使用静态updateMap方法将HashMap作为静态变量移动到单独的实用程序类是否会违反Java最佳实践?当我想要移动数据时,我必须添加一个getter方法来调用,以及一个清除将在Animal构造函数中调用的map的方法。动物一次只迭代一次,只有一次,所以不会与更新发生冲突。

我想创建静态实用程序类的原因是希望它能提高性能。动物名单上有数百万个项目,我觉得如果每个动物都不需要用它创造,我能够加快一点(即使它几乎不会引起注意) HashMap作为类变量。但我不知道对静态方法的调用是否会降低它的速度。如果您知道更好的(性能方面)设计来跟踪运动,那么对此的任何意见都将受到赞赏。

伪代码:

电流:

Animal.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;
      }
 }

Dog.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");
      }

变化:

Animal.java

 public abstract class Animal {

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

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

Dog.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();
      }
 }

谢谢。

2 个答案:

答案 0 :(得分:1)

要问自己一个问题:每只动物都有自己的HashMap是否有意义?这听起来像答案是否定的,因为这是#34;共享"数据是"全球"。

将其设为static变量是合理的。我建议也考虑其他选择。例如,听起来HashMap存储有关动物生活世界的信息。因此,此变量可能属于另一个类WorldFarm,而不属于Animal类。

答案 1 :(得分:1)

问题是,大多数情况下,当您创建实用程序类时,您不知道代码的责任。根据清洁法典,所有语言的最佳实践是,您编写的每个代码的和平都有自己的域名和自己的责任。因此,请将您想要全局使用的HashMap放入一个有责任计算和观察不同动物运动的类中。那是我的建议。