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

用于数据存储的Java静态变量与本地变量,java,inheritance,static,abstract,extends,Java,Inheritance,Static,Abstract,Extends,我用动物来代替我的真实代码,所以这看起来可能有点愚蠢,但这是一个真正的问题 我的java程序得到一个不同动物的列表,并一次遍历一个,对每个动物执行以下操作:创建动物,动物做一些随机运动,计算每个运动,然后程序收集运动数据,进行一些分析,并继续处理列表上的下一个动物 我有一个抽象的动物类,由不同的动物对象扩展而成,狗,猫等等,每个都有自己的动作。在这个基础动物类中,有一个计算动物随机运动的哈希图 每个movement方法都以对updateMap的调用结束,updateMap位于Animal基类中。

我用动物来代替我的真实代码,所以这看起来可能有点愚蠢,但这是一个真正的问题

我的java程序得到一个不同动物的列表,并一次遍历一个,对每个动物执行以下操作:创建动物,动物做一些随机运动,计算每个运动,然后程序收集运动数据,进行一些分析,并继续处理列表上的下一个动物

我有一个抽象的动物类,由不同的动物对象扩展而成,狗,猫等等,每个都有自己的动作。在这个基础动物类中,有一个计算动物随机运动的哈希图

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

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

我想要创建静态实用程序类的原因是我希望它能提高性能。动物列表有数百万个条目,我想如果每个条目都不必使用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;
      }
 }
 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(){
           .
           .
           updateMap("jump");
      }

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

      private void dance(){
           .
           .
           updateMap("dance");
      }
 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");
      }
 }
更改:

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;
      }
 }
 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(){
           .
           .
           updateMap("jump");
      }

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

      private void dance(){
           .
           .
           updateMap("dance");
      }
 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有意义吗?答案似乎是否定的,因为这是“共享的”数据,是“全球的”


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

要问自己一个问题:每个动物都有自己的HashMap有意义吗?答案似乎是否定的,因为这是“共享的”数据,是“全球的”


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

问题是,大多数时候,当您创建实用程序类时,是因为您不知道其中的代码的责任。根据干净的代码,所有语言中的最佳实践是,您编写的每一段代码都有自己的领域和责任。因此,把你想在全球范围内使用的HashMap放在一个类中,这个类负责计算和观察不同动物的运动。这就是我的建议。

问题是,大多数情况下,创建实用程序类是因为您不知道其中的代码的责任。根据干净的代码,所有语言中的最佳实践是,您编写的每一段代码都有自己的领域和责任。因此,把你想在全球范围内使用的HashMap放在一个类中,这个类负责计算和观察不同动物的运动。这是我的建议。

我们理解代码。发布代码而不是描述它。我部分同意@JBNizet。虽然我会说post代码以及描述它。添加一些粗略的代码您的建议将创建尽可能多的哈希图,占用相同的时间和内存,但您将失去原始代码的许多有趣特性:您将无法同时使用/分析两个动物,您将无法并行使用/分析多个动物,您必须在最后一次分析后清除地图,而不是在动物超出范围后仅依靠GC完成其工作。全局可变状态通常是一个糟糕的想法,这种情况也不例外。我们理解代码。发布代码而不是描述它。我部分同意@JBNizet。虽然我会说post代码以及描述它。添加一些粗略的代码您的建议将创建尽可能多的哈希图,占用相同的时间和内存,但您将失去原始代码的许多有趣特性:您将无法同时使用/分析两个动物,您将无法并行使用/分析多个动物,您必须在最后一次分析后清除地图,而不是在动物超出范围后仅依靠GC完成其工作。全局可变状态通常是一个糟糕的想法,这种情况也不例外。非常好的观点。每一个班级都应该有一个责任并把它做好。非常好。每一个班级都应该有一个责任并把它做好。