Java: UUID, генерирующий синглтон - PullRequest
1 голос
/ 11 мая 2019

Я работаю над школьным проектом, который похож на более простой клон Youtube.Я знаю, что одним из атрибутов классов Video и Playlist является строковый код, который я могу генерировать любым способом, который мне нужен, при условии, что он всегда уникален.Поэтому мне трудно использовать 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 предупреждает меня в обоих случаях, что я должен изменить эту ссылку на экземпляр на статическую ссылку, и я никогда не был хорош в статических вещах, и с тех порЯ хочу избавиться от всех этих предупреждений о коде для моего проекта, кто-нибудь может сказать мне исправление, которое делает то, что я ищу?

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

1 Ответ

4 голосов
/ 11 мая 2019

Проблема не в том, что делать с вашим синглтоном, а в том, что вы вызываете 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();
    }

}
...