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;
}