Util 类 中有私有静态字段不好吗?
Is it bad to have private static fields in Util classes?
假设我在 util class 中有一个方法,它有一个不能在方法中更改的参数,因为它会改变结果并需要以某种方式保存,对吗?在 util class 中有一个 private static
字段是一种不好的做法吗?如果是,如何正确操作。
我的意思是这样的:
public class Util {
private static final int[] vector1Backup = new int[3];
private static final int[] vector2Backup = new int[3];
private Util() {
}
public static void doOperation(int[] vector1, int[] vector2, int[] result){
// backups needed for the case that vecto1 or vector2 = result
vector1Backup[0] = vector1[0];
vector1Backup[1] = vector1[1];
vector1Backup[2] = vector1[2];
vector2Backup[0] = vector2[0];
vector2Backup[1] = vector2[1];
vector2Backup[2] = vector2[2];
result[0] = vector1Backup[0] + vector2Backup[2];
result[1] = vector1Backup[1] + vector2Backup[1];
result[2] = vector1Backup[2] + vector2Backup[0];
}
}
编辑:只存在一个线程
一般来说,拥有私有常量并不是一个坏习惯。隐藏 class 的内部结构很好,在 OOP 中我们称之为封装。但是我觉得你的代码应该稍微改变一下。
1) 就我个人而言,我完全反对静态方法,恕我直言,它们不遵循 OOP 并使测试更加困难。然而,一堆图书馆和 java 本身就有一堆。所以我想这是品味问题。如果你喜欢静态方法,你应该做无状态的,这意味着不要在 class 中存储任何东西,只需根据 vector1 和 vector2 创建结果,return 从方法中得到结果。
2) 在静态 class 中存储一些东西很容易出错。我会创建单独的 class 并将其命名为 VectorBackup。在那 class 我会像你一样存储向量。然后您可以创建所需数量的实例(备份)。这将是线程安全的(在一定程度上)并且更像 OOP。如果你有 3 个向量而不是 2 个向量,那么更改代码也会更容易。
3) 常量 classes 应该有私有构造函数并且它们应该是 final
,所以没有人可以扩展它们。
public final class Util {
private Util() {
}
public static void doOperation(int[] vector1, int[] vector2) {
int[] result = new int[3];
result[0] = vector1[0] + vector2[2];
result[1] = vector1[1] + vector2[1];
result[2] = vector1[2] + vector2[0];
return result;
}
}
public class Backup {
private final int[] vectorBackup = new int[3];
public Backup(int[] vector) {
vectorBackup[0] = vector[0];
vectorBackup[1] = vector[1];
vectorBackup[2] = vector[2];
}
public int[] restore(){
//some code to create vector from backup
}
}
拥有私有常量并不是一个坏习惯。
但是在你的例子中,你有一个像缓冲区这样的私有字段。另外你做so-calledin-place操作,改变result
数组的值。
如果我是你,我会创建一个 returns 结果
的函数
int[] doOperation(int[] vector1, int[] vector2){
int[] result = new int[vector1.length];
// do your logic
return result;
}
假设我在 util class 中有一个方法,它有一个不能在方法中更改的参数,因为它会改变结果并需要以某种方式保存,对吗?在 util class 中有一个 private static
字段是一种不好的做法吗?如果是,如何正确操作。
我的意思是这样的:
public class Util {
private static final int[] vector1Backup = new int[3];
private static final int[] vector2Backup = new int[3];
private Util() {
}
public static void doOperation(int[] vector1, int[] vector2, int[] result){
// backups needed for the case that vecto1 or vector2 = result
vector1Backup[0] = vector1[0];
vector1Backup[1] = vector1[1];
vector1Backup[2] = vector1[2];
vector2Backup[0] = vector2[0];
vector2Backup[1] = vector2[1];
vector2Backup[2] = vector2[2];
result[0] = vector1Backup[0] + vector2Backup[2];
result[1] = vector1Backup[1] + vector2Backup[1];
result[2] = vector1Backup[2] + vector2Backup[0];
}
}
编辑:只存在一个线程
一般来说,拥有私有常量并不是一个坏习惯。隐藏 class 的内部结构很好,在 OOP 中我们称之为封装。但是我觉得你的代码应该稍微改变一下。
1) 就我个人而言,我完全反对静态方法,恕我直言,它们不遵循 OOP 并使测试更加困难。然而,一堆图书馆和 java 本身就有一堆。所以我想这是品味问题。如果你喜欢静态方法,你应该做无状态的,这意味着不要在 class 中存储任何东西,只需根据 vector1 和 vector2 创建结果,return 从方法中得到结果。
2) 在静态 class 中存储一些东西很容易出错。我会创建单独的 class 并将其命名为 VectorBackup。在那 class 我会像你一样存储向量。然后您可以创建所需数量的实例(备份)。这将是线程安全的(在一定程度上)并且更像 OOP。如果你有 3 个向量而不是 2 个向量,那么更改代码也会更容易。
3) 常量 classes 应该有私有构造函数并且它们应该是 final
,所以没有人可以扩展它们。
public final class Util {
private Util() {
}
public static void doOperation(int[] vector1, int[] vector2) {
int[] result = new int[3];
result[0] = vector1[0] + vector2[2];
result[1] = vector1[1] + vector2[1];
result[2] = vector1[2] + vector2[0];
return result;
}
}
public class Backup {
private final int[] vectorBackup = new int[3];
public Backup(int[] vector) {
vectorBackup[0] = vector[0];
vectorBackup[1] = vector[1];
vectorBackup[2] = vector[2];
}
public int[] restore(){
//some code to create vector from backup
}
}
拥有私有常量并不是一个坏习惯。
但是在你的例子中,你有一个像缓冲区这样的私有字段。另外你做so-calledin-place操作,改变result
数组的值。
如果我是你,我会创建一个 returns 结果
的函数int[] doOperation(int[] vector1, int[] vector2){
int[] result = new int[vector1.length];
// do your logic
return result;
}