在Util类中拥有私有静态字段是否不好?

时间:2019-05-07 20:17:42

标签: java access-modifiers

比方说,我在util类中有一个方法,该方法的参数无法在该方法中更改,因为它会更改结果并需要以某种方式保存,因此拥有一个不好的习惯util类中的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];
    }

}

编辑:只有一个线程存在

2 个答案:

答案 0 :(得分:0)

通常,拥有私有常量并不是一个坏习惯。隐藏类的内部结构很好,在OOP中,我们称之为封装。但是我觉得您的代码应该进行一些更改。

1)就我个人而言,我完全反对静态方法,恕我直言,它们不遵循OOP,因此会使测试更加困难。但是,一堆库和java本身都有一堆。我想这就是味道。而且,如果您喜欢静态方法,则应使其无状态,这意味着不要在类内存储任何内容,只需基于vector1和vector2创建结果,然后从该方法返回即可。

2)在静态类中存储某些内容容易出错。我只是创建单独的类,并将其命名为VectorBackup。在该课程中,我将像您一样存储向量。然后,您可以创建所需数量的实例(备份)。这将是线程安全的(在某种程度上)和更多的OOP之类的。另外,如果您有3个向量而不是2个向量,更改代码也将更加容易。

3)常量类应具有私有构造函数,并且它们应为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
    }

}

答案 1 :(得分:0)

拥有私有常量不是一个坏习惯。

但是,在您的情况下,您有一个私有字段(例如缓冲区)。另外,您可以进行所谓的就地操作,从而更改result数组的值。

如果我是你,我将创建一个返回结果的函数

int[] doOperation(int[] vector1, int[] vector2){
  int[] result = new int[vector1.length];
  // do your logic
  return result;
}