Форум программистов, компьютерный форум, киберфорум
Java для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
1 / 1 / 0
Регистрация: 01.02.2021
Сообщений: 39

Аннотации

07.05.2021, 01:39. Показов 864. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите, пожалуйста, а как использовать свои анотации для енам? Мне надо, чтобы в енаме у меня лежали константы с названиями консольных команд для чтения книги. Эти команды что-то умеют делать, а в консоль надо вызывать только помеченные аннотациями методы. Я вот не могу в едино все собрать.
В идеале, когда я ввожу к консоль команду, например, read(она помечена аннотацией) и выводит название команды и кол-во в int прочтенных страниц при это генерируется случайным образом кол-во страниц.
Или например команда remove (также помечена аннотацией) и выводит название командв и кол-во int
удаленных страниц и тоже генерируется рандомно.
Не могу понять, каким образом мне создавать енам с методами исходя из названий и потом его использовать с аннотациями.
енам приблизительно такой и все эти константы должны работать примерно одинаково, название команды и кол-во страниц рандомно
READ,
REMOVE,
HIGHLIGHT_TEXT,
CUT_TEXT,
TEAR_OUT_THE_PAGES;
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.05.2021, 01:39
Ответы с готовыми решениями:

Аннотации основы
Добрый день! Кто разбирается в java помогите разобраться с одним вопросом. Читал книгу...

Аннотации
Town.createUpdate(Town.class); import org.apache.logging.log4j.Level; public class Town extends Entity{ Town(String arg_0){ ...

Аннотации в Java
Объясните Пожалуйста, что на Java обозначает: "@Override" .

8
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
07.05.2021, 02:45
Какой-то сумбур. Давай ты свою кашу в порядок приведешь и как-то более структурированно опишешь, что требуется сделать.
1
1 / 1 / 0
Регистрация: 01.02.2021
Сообщений: 39
07.05.2021, 16:57  [ТС]
xoraxax, ок
если попытаться собрать кашу, то необходимо с помощью аннотации выводить в консоль только те методы, которые ей помечены. Например вводишь общее кол-во страниц и тебе рандомно выводится кол-во задействованных страниц и возможные команды.

ввод
Введите название книги и кол-во страниц в ней:
Sapiens: A Brief History of Humankind 520

вывод:
Title of the book - "Sapiens: A Brief History of Humankind",
Number of used pages - 334,
Comand - remove
successfully!

Title of the book - "Sapiens: A Brief History of Humankind",
Number of used pages - 190,
Comand - read
successfully!

Title of the book - "Sapiens: A Brief History of Humankind",
Number of used pages - 0,
Comand - Cut text
failure


Т.е. суть в том, чтобы один раз вызвать функцию-ввести данные и получить все возможные методы (помеченные своей аннотацией)
Я предполагаю делать команды в енам, но не могу понять как это нормально соединить, чтобы в консоле был такой вывод, как в примере выше.
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
07.05.2021, 18:45
причем тут вообще аннотации?
0
1 / 1 / 0
Регистрация: 01.02.2021
Сообщений: 39
07.05.2021, 19:42  [ТС]
xoraxax, задание такое, использовать свои аннотации для методов и запускать только помеченные методы)
0
 Аватар для HighPredator
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
07.05.2021, 23:19
Похоже я понял это задание, но это ну ни разу не для начинающих.

Дисклеймер: все, что дальше -- моя личная интерпретация задания с упрощениями для наглядности (ну и потому что вечер и я торопился). Потребуется мелкая доп зависимость в виде reflections

Итак, команды. Ну тут тривиально: все через соответствующий шаблон проектирования и Executor для исполнения команд относительно книги. По условию, для каждой книги через аннотацию должно быть определено, какие команды для нее допустимы. Плюс, надо использовать перечисление для сего. Делаем следующую систему:
1) Перечисление для команд
Java
1
2
3
4
5
public enum Commands {
    UPPERCASE,
    ASTERISK,
    SNAKE_CASE;
}
2) интерфейс для команд:
Java
1
2
3
public interface Command {
    void execute();
}
3) конфигурационная аннотация для книг, в которую прописываются допустимые команды для каждой книги:
Java
1
2
3
4
@Retention(RUNTIME)
public @interface CommandConfiguration {
    Commands[] allowedCommands();
}
4) аннотация-айдишник для команд (маппится на перечисление):
Java
1
2
3
4
@Retention(RUNTIME)
public @interface CommandId {
    Commands value();
}
5) сделаем три разных команды-реализации
Java
1
2
3
4
5
6
7
@CommandId(ASTERISK)
public class AsteriskCommand implements Command {
    @Override
    public void execute() {
        System.out.println("Executing AsteriskCommand: printing asterisks *****************");
    }
}
Java
1
2
3
4
5
6
7
@CommandId(SNAKE_CASE)
public class SnakeCaseCommand implements Command {
    @Override
    public void execute() {
        System.out.println("Executing SnakeCaseCommand: printing_in_snake_case_everything");
    }
}
Java
1
2
3
4
5
6
7
@CommandId(UPPERCASE)
public class UppercaseCommand implements Command {
    @Override
    public void execute() {
        System.out.println("Executing UppercaseCommand: PRINTING IN UPPERCASE");
    }
}
и пару книг с разным набором допустимых команд:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public abstract class Book {
    private String description;
 
    public Book(String description) {
        this.description = description;
    }
 
    public String getDescription() {
        return description;
    }
 
    public void setDescription(String description) {
        this.description = description;
    }
}
Java
1
2
3
4
5
6
@CommandConfiguration(allowedCommands = {ASTERISK, SNAKE_CASE})
public class Moby****Book extends Book {
    public Moby****Book() {
        super("Book about Moby ****");
    }
}
Java
1
2
3
4
5
6
@CommandConfiguration(allowedCommands = {SNAKE_CASE, ASTERISK, UPPERCASE})
public class WarAndPeaceBook extends Book {
    public WarAndPeaceBook() {
        super("WAR and PEACE");
    }
}
6) и самое сложное -- исполнитель команд относительно книг:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
public class Executor {
    private static final Command DENIED_COMMAND = () -> System.out.println("DENIED");
    private static final Command NOT_IMPLEMENTED_COMMAND = () -> System.out.println("NOT IMPLEMENTED");
 
    private final EnumMap<Commands, Command> commandMap = new EnumMap<>(Commands.class);
 
    private final String packageToScan;
 
    public Executor(String packageToScan) {
        this.packageToScan = packageToScan;
    }
 
    public void init() {
        Reflections reflections = new Reflections(packageToScan);
 
        Set<Class<? extends Command>> commands = reflections.getSubTypesOf(Command.class);
 
        for (Class<? extends Command> command : commands) {
            if (command.isAnnotationPresent(CommandId.class)) {
                CommandId id = command.getAnnotation(CommandId.class);
 
                Command instance;
                try {
                    instance = command.getDeclaredConstructor().newInstance();
                } catch (Exception e) {
                    throw new RuntimeException(e);
                }
 
                commandMap.put(id.value(), instance);
            }
        }
    }
 
    public void applyCommand(Commands command, Book book) {
        if (book.getClass().isAnnotationPresent(CommandConfiguration.class)) {
            CommandConfiguration configuration = book.getClass().getAnnotation(CommandConfiguration.class);
 
            Command commandToRun = determineCommand(configuration, command);
 
            System.out.println(book.getDescription());
 
            commandToRun.execute();
        }
    }
 
    private Command determineCommand(CommandConfiguration configuration, Commands command) {
        if (Arrays.asList(configuration.allowedCommands()).contains(command))
            return commandMap.getOrDefault(command, NOT_IMPLEMENTED_COMMAND);
 
        return DENIED_COMMAND;
    }
}
Что оно делает. В конструкторе он принимает пакет, в котором при вызове инит метода автоматически будет произведен поиск всех реализаций интерфейса команд имеющих аннотацию-айдишник, будут созданы по инстансу на каждый и сложены относительно айдишника-перечисления в мапу.
Затем, когда мы хотим исполнить команду в методе applyCommand, мы смотрим есть ли такая в списке разрешенных для книги и пытаемся найти такую в мапе. Если для нее есть реализация, то она будет исполнена, а если нет, то будет исполнен соотвествующий дефолт.

Простой мейн:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Main {
    public static void main(String[] args) {
        Executor executor = new Executor("com.test");
 
        executor.init();
 
        Book moby**** = new Moby****Book();
        Book warAndPeace = new WarAndPeaceBook();
 
        testBook(moby****, executor);
        testBook(warAndPeace, executor);
    }
 
    private static void testBook(Book book, Executor executor) {
        Arrays.stream(Commands.values()).forEach(command -> executor.applyCommand(command, book));
    }
}
Выхлоп:
Code
1
2
3
4
5
6
7
8
9
10
11
12
Book about Moby ****
DENIED
Book about Moby ****
Executing AsteriskCommand: printing asterisks *****************
Book about Moby ****
Executing SnakeCaseCommand: printing_in_snake_case_everything
WAR and PEACE
Executing UppercaseCommand: PRINTING IN UPPERCASE
WAR and PEACE
Executing AsteriskCommand: printing asterisks *****************
WAR and PEACE
Executing SnakeCaseCommand: printing_in_snake_case_everything
Добавлено через 4 минуты
Блин, движок форума вставил звездочек на книгу... В общем книга -- Моби Дик. Кто будет копировать код -- вот четыре звездочки это Дик.
2
1 / 1 / 0
Регистрация: 01.02.2021
Сообщений: 39
07.05.2021, 23:38  [ТС]
HighPredator, ого!! это ты в торопях накидал?) мне бы так!!) возможно, не для совсем начинающих, но эта тема затронулась и для закрепления, понимания дали задание. Спасибо большое, я постараюсь вникнуть в это решение и разобраться!
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
07.05.2021, 23:48
Цитата Сообщение от HighPredator Посмотреть сообщение
Moby****
wat
0
08.05.2021, 10:52

Не по теме:

Цитата Сообщение от xoraxax Посмотреть сообщение
wat
ну это
Цитата Сообщение от HighPredator Посмотреть сообщение
движок форума вставил звездочек на книгу... В общем книга -- Моби Дик

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.05.2021, 10:52
Помогаю со студенческими работами здесь

Конфигурирование и аннотации
Всем привет. Может кто поможет. Сразу скажу, что нельзя юзать никаких библиотек и т.п. Постараюсь максимально просто изложить проблему....

Аннотации JPA
Здравствуйте, всем! Ребята подскажите пожалуйста как правильно аннотировать. есть таблица скажем T1, в нем есть поля (id, name) так...

Аннотации и getAnnotation
Изучаю Java, остановился на аннотациях, но никак не получается реализовать рефлексию, вот код: package chapt2; import...

Аннотации, .class
Здравствуйте, подскажите пожалуйста что означает .class из этого кода: public class Meta2 { @MyAnno2(str = &quot;Два...

Аннотации и Рефлексия
Парни, подскажите что не так я делаю. У меня кидает исключение java.lang.IllegalArgumentException: wrong number of arguments ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru