用于数据存储的Java静态变量与本地变量
我用动物来代替我的真实代码,所以这看起来可能有点愚蠢,但这是一个真正的问题 我的java程序得到一个不同动物的列表,并一次遍历一个,对每个动物执行以下操作:创建动物,动物做一些随机运动,计算每个运动,然后程序收集运动数据,进行一些分析,并继续处理列表上的下一个动物 我有一个抽象的动物类,由不同的动物对象扩展而成,狗,猫等等,每个都有自己的动作。在这个基础动物类中,有一个计算动物随机运动的哈希图 每个movement方法都以对updateMap的调用结束,updateMap位于Animal基类中。updateMap接收移动字符串键作为输入,然后检查给定的移动是否作为键在HashMap中,如果不是,则将移动添加为键,值为1。如果移动已经是HashMap中的一个键,它将增加数值 当前的设置是HashMap在Animal类中,因此每个动物都有自己的HashMap。我的问题是,使用静态updateMap方法将HashMap作为一个静态变量移动到一个单独的实用程序类是否会违反Java最佳实践?我必须添加一个getter方法,以便在需要运动数据时调用,以及一个清除映射的方法,该映射将在动物构造函数中调用。这些动物一次只迭代一次,因此不会与更新发生冲突 我想要创建静态实用程序类的原因是我希望它能提高性能。动物列表有数百万个条目,我想如果每个条目都不必使用HashMap作为类变量创建的话,我可以稍微加快一点速度(即使它几乎不明显)。但是我不知道对静态方法的调用是否会减慢速度。如果您知道更好的(性能方面的)设计来跟踪运动,您对此有任何意见都将不胜感激 伪代码: 当前: Animal.java用于数据存储的Java静态变量与本地变量,java,inheritance,static,abstract,extends,Java,Inheritance,Static,Abstract,Extends,我用动物来代替我的真实代码,所以这看起来可能有点愚蠢,但这是一个真正的问题 我的java程序得到一个不同动物的列表,并一次遍历一个,对每个动物执行以下操作:创建动物,动物做一些随机运动,计算每个运动,然后程序收集运动数据,进行一些分析,并继续处理列表上的下一个动物 我有一个抽象的动物类,由不同的动物对象扩展而成,狗,猫等等,每个都有自己的动作。在这个基础动物类中,有一个计算动物随机运动的哈希图 每个movement方法都以对updateMap的调用结束,updateMap位于Animal基类中。
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完成其工作。全局可变状态通常是一个糟糕的想法,这种情况也不例外。非常好的观点。每一个班级都应该有一个责任并把它做好。非常好。每一个班级都应该有一个责任并把它做好。