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



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

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

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

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

目前的设置是HashMap在Animal类中,所以每个Animal都有自己的。 我的问题是,使用静态updateMap方法将HashMap作为静态变量移动到单独的实用程序类是否违反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");
}
}

动物利用.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类。

问题是,大多数时候,当你创建一个实用程序类时,是因为你不知道里面的代码的责任。根据 Clean Code 的所有语言的最佳实践是,您编写的每个代码都有自己的领域和自己的责任。因此,将您想要全局使用的HashMap放在一个负责计数和观察不同动物运动的类中。这是我的建议。

最新更新