Java: UUID, генерирующий синглтон

Я работаю над школьным проектом, который похож на более простой клон Youtube. Я знаю, что одним из атрибутов классов Video и Playlist является код String, который я могу генерировать любым способом, если он всегда уникален. Поэтому мне сложно использовать UUID (хотя я довольно новичок в этом), и дело в том, что видео и плейлист могут иметь один и тот же код, потому что они находятся в разных библиотеках в моем коде, поэтому теоретически я хотел бы 2 UUID генераторы, один для видео, один для списков воспроизведения, поэтому коды могут перекрываться таким образом.

Я подумал сделать синглтон, чтобы генераторов было не больше, чем мне нужно, и я всегда могу гарантировать, что получаю уникальные коды. Вот что я получил.

import java.util.UUID;

public class CodeGenerator {

    private static CodeGenerator singleInstance = null;

    private UUID videoGen;
    private UUID listGen;

    private CodeGenerator() {
    }

    public static CodeGenerator getInstance() {
        if (singleInstance == null) 
            singleInstance = new CodeGenerator(); 

        return singleInstance;
    }

    public String getCodeVideo() {
        return videoGen.randomUUID().toString();
    }

    public String getCodePlaylist() {
        return listGen.randomUUID().toString();
    }
}

Но Eclipse предупреждает меня в обоих моих получениях, что я должен изменить эту ссылку на экземпляр на статическую ссылку, и я никогда не был хорош в статических вещах, и поскольку я хочу избавиться от всех этих предупреждений кода для моего проекта, может ли кто-нибудь сказать мне исправление, которое делает то, что я ищу?

P.S. Я пытаюсь сгенерировать некоторые коды в тестовом классе двумя разными методами, и они всегда получаются разными и такими, как ожидалось. Код работает нормально, и я вижу, но я боюсь, что в будущем это может создать мне проблемы.

randomUUID() — это static метод, вызывать его для экземпляра (который вы даже не инициализировали правильно) не имеет смысла. Это то, что Eclipse говорит вам.
Tom 11.05.2019 12:58
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
887
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема не в вашем синглтоне, а в том, что вы вызываете UUID.randomUUID(), который является статическим методом, как если бы это был метод экземпляра.

Вот более короткий пример, который, как я ожидаю, даст такое же предупреждение:

import java.util.UUID;

public class Test {
    public static void main(String[] args) {
        UUID ignored = null;
        UUID generated = ignored.randomUUID();
    }
}

По сути, ваши поля бессмысленны - вы все равно никогда не присваиваете им значение.

Мне непонятно, ожидаете ли вы, что getCodeVideo() всегда будет возвращать одну и ту же строку на протяжении всего жизненного цикла вашего процесса. Если это является, вы должны изменить код на что-то вроде:

import java.util.UUID;

public class CodeGenerator {

    private static CodeGenerator singleInstance = new CodeGenerator();

    private String video;
    private String codePlayList;

    private CodeGenerator() {
        video = UUID.randomUUID().toString();
        codePlayList = UUID.randomUUID().toString();
    }

    public static CodeGenerator getInstance() {
        return singleInstance;
    }

    public String getCodeVideo() {
        return video;
    }

    public String getCodePlayList() {
        return codePlayList;
    }
}

Если вы действительно хотите генерировать новую строку каждый раз, когда вы вызываете метод, вам не нужен синглтон или что-то в этом роде:

import java.util.UUID;

public class CodeGenerator {
    public static String generateCode() {
        return UUID.randomUUID().toString();
    }

}

Я хочу, чтобы каждый раз, когда я вызываю getCodeVideo(), возвращалась другая строка, но я также хочу, чтобы getCodePlaylist() мог возвращать строки, которые были возвращены функцией getCodeVideo().

Catralitos 11.05.2019 13:20

Так что даже с 2 UUID я не могу получить, так сказать, два набора кодов? Это не имеет большого значения, пока коды всегда уникальны, код будет работать, но я как бы хотел иметь два набора кодов.

Catralitos 11.05.2019 14:21

@Catralitos Иметь два вызова - это нормально, но вы видите, что делаете одно и то же в каждом из них - нет никакой разницы - (в настоящее время) это просто вопрос общения с разработчиком (и точка расширения). Конечно, вы можете предварительно/добавить «c»/«v», чтобы указать видео или плейлист, что может быть полезно в качестве простого визуального индикатора.

Dave Newton 11.05.2019 15:25

Другие вопросы по теме