我用动物替换了我的真实代码,所以看起来有点傻但这是一个真正的问题。
我的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();
}
}
谢谢。
答案 0 :(得分:1)
要问自己一个问题:每只动物都有自己的HashMap是否有意义?这听起来像答案是否定的,因为这是#34;共享"数据是"全球"。
将其设为static
变量是合理的。我建议也考虑其他选择。例如,听起来HashMap存储有关动物生活世界的信息。因此,此变量可能属于另一个类World
或Farm
,而不属于Animal
类。
答案 1 :(得分:1)
问题是,大多数情况下,当您创建实用程序类时,您不知道代码的责任。根据清洁法典,所有语言的最佳实践是,您编写的每个代码的和平都有自己的域名和自己的责任。因此,请将您想要全局使用的HashMap放入一个有责任计算和观察不同动物运动的类中。那是我的建议。