Разве плохо иметь частные статические поля в классах Util? - PullRequest
1 голос
/ 07 мая 2019

Скажем, у меня есть метод в классе утилит, у которого есть параметр, который нельзя изменить в методе, потому что он изменит результат и его нужно каким-то образом сохранить, будет ли плохая практика иметь 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 голосов
/ 07 мая 2019

Это неплохая практика иметь частные константы.

Но в вашем случае у вас есть личное поле, например буфер.Кроме того, вы выполняете так называемую операцию на месте, изменяя значение массива result.

На вашем месте я бы создал функцию, которая возвращает результат

int[] doOperation(int[] vector1, int[] vector2){
  int[] result = new int[vector1.length];
  // do your logic
  return result;
}
0 голосов
/ 07 мая 2019

Вообще неплохо иметь частные константы.Хорошо скрывать внутренние классы, в ООП мы называем это инкапсуляцией.Однако я чувствую, что ваш код должен быть немного изменен.

1) Лично я вообще против статических методов, имхо, они не следуют ООП и затрудняют тестирование.Однако куча библиотек и сама java имеют кучу их.Так что дело вкуса, наверное.А если вам нравятся статические методы, вы должны делать их без сохранения состояния, то есть ничего не хранить внутри класса, просто создать результат на основе vector1 и vector2 и вернуть его из метода.

2) Хранение чего-либо в статическомкласс отчасти подвержен ошибкам.Я бы просто создал отдельный класс и назвал бы его VectorBackup.В этом классе я буду хранить вектор, как вы делаете.Затем вы можете создать любое количество экземпляров (резервных копий).Это было бы потокобезопасно (в определенной степени) и больше похоже на ООП.Также было бы легче изменить ваш код в случае, если у вас будет 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
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...