Я работаю над школьным проектом, который похож на более простой клон 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. Я пытаюсь сгенерировать некоторые коды в тестовом классе двумя разными методами, и они всегда получаются разными и такими, как ожидалось. Код работает нормально, и я вижу, но я боюсь, что в будущем это может создать мне проблемы.
Проблема не в вашем синглтоне, а в том, что вы вызываете 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().
Так что даже с 2 UUID я не могу получить, так сказать, два набора кодов? Это не имеет большого значения, пока коды всегда уникальны, код будет работать, но я как бы хотел иметь два набора кодов.
@Catralitos Иметь два вызова - это нормально, но вы видите, что делаете одно и то же в каждом из них - нет никакой разницы - (в настоящее время) это просто вопрос общения с разработчиком (и точка расширения). Конечно, вы можете предварительно/добавить «c»/«v», чтобы указать видео или плейлист, что может быть полезно в качестве простого визуального индикатора.
randomUUID()
— этоstatic
метод, вызывать его для экземпляра (который вы даже не инициализировали правильно) не имеет смысла. Это то, что Eclipse говорит вам.