#define директива в Java

Я ищу способ использовать что-то похожее на #define в Java. Я знаю, что там нет препроцессора, но я сомневаюсь, что что-то подобное невозможно реализовать. В идеале я ищу способ перевести этот код C++ на Java:

#include <cstdio>
#define HelloWorld
#define BEGIN {
#define END }
#define PROGRAM int main()
#define WRITELN(a) puts(a);

PROGRAM HelloWorld

BEGIN
    WRITELN("Hello, World")
END

Прежде чем это будет помечено как дубликат, я хочу заявить, что я ищу способ определения строковой константы перед компиляцией, на этом сайте есть вопросы о числовых, но это не то, что я ищу. Мне, видимо, нужно еще раз объяснить, чем отличается этот вопрос. OP вопроса, который кто-то связал, спрашивает, существует ли #define в Java, на что ответ отрицательный. Я спрашиваю, как объявить строковые константы, которые оцениваются перед компиляцией.

И я также знаю, что использование этого ограничено, но, тем не менее, я не понимаю, почему что-то вроде #define NAME Larry не может быть полезным.

Что ж, если вы ищете константы, вам подойдет что-то определенное как static final.

MC Emperor 21.10.2018 00:21

Кроме того, это очень плохой способ писать код на C++. Зачем тебе это нужно, чтобы это выглядело так?

Joseph Sible-Reinstate Monica 21.10.2018 00:22

Это непонятно - в вашем фрагменте кода не определены строковые константы.

Oliver Charlesworth 21.10.2018 00:27

@MCEmperor Я ищу строковую константу, которую нужно объявить перед компиляцией.

Larry Teischwilly 21.10.2018 00:28

@OliverCharlesworth Что именно непонятно и что вы имеете в виду, в моем фрагменте кода не определены строковые константы? Я насчитал 5 из них; stackoverflow.com/a/1431600/9165579

Larry Teischwilly 21.10.2018 00:30

Если вам нужна специальная предварительная обработка, обратите внимание на аннотации.

Kilian 21.10.2018 00:37
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
6
1 116
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Думаю, я понимаю, к чему вы клоните; вы используете операторы #define как способ определения вашего собственного DSL; то есть вы пишете конкретные операторы, которые компилятор переводит в допустимый синтаксис.

Это ... не совсем возможно с Java. Причина этого в том, что подход Java к компиляции относительно высечен.

Вероятно, есть способ обойти это; Суть кода в том, что он должен преобразовать в действительный байт-код на каком-то уровне. Если вы намереваетесь получить язык, подобный DSL, вы можете рассмотреть Groovy или Котлин, которые позволяют более чистыми способами выразить то, что в конечном итоге станет действительным байт-кодом Java.

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