#define в Java
Я начинаю программировать на Java и мне интересно, если эквивалент C++ .
быстрый поиск google говорит, что это не так, но может ли кто-нибудь сказать мне, Существует ли что-то подобное
на Яве? Я пытаюсь сделать мой код более читабельным.
вместо myArray[0] Я хочу иметь возможность писать myArray[PROTEINS] например.
7 ответов:
нет, потому что нет прекомпилятором.
тем не менее, Hotspot довольно удивительно хорош в оптимизации, где это возможно, поэтому в вашем случае вы можете достичь того же самого:
class MyClass { private static final int PROTEINS = 0; ... MyArray[] foo = new MyArray[PROTEINS]; }компилятор заметит, что
PROTEINSникогда не может измениться и поэтому будет встроен в него, что более или менее то, что вы хотите.обратите внимание, что модификатор доступа к константе здесь не важен, поэтому он может быть
publicилиprotectedвместо частного, если вы хотите чтобы повторно использовать одну и ту же константу в нескольких классах.
комментировать пространство слишком мало, так что вот еще немного информации для вас об использовании
static final. Как я уже сказал в своем комментарии к Анджей ответ, только примитивные иStringкомпилируются непосредственно в код в качестве литералов. Чтобы продемонстрировать это, попробуйте следующее:вы можете увидеть это в действии, создав три класса (в отдельных файлах):
public class DisplayValue { private String value; public DisplayValue(String value) { this.value = value; } public String toString() { return value; } } public class Constants { public static final int INT_VALUE = 0; public static final DisplayValue VALUE = new DisplayValue("A"); } public class Test { public static void main(String[] args) { System.out.println("Int = " + Constants.INT_VALUE); System.out.println("Value = " + Constants.VALUE); } }скомпилируйте их и запустите тест, который печатает:
Int = 0 Value = Aтеперь измените
Constantsчтобы иметь разное значение для каждого и просто скомпилировать классConstants. Когда вы выполняетеTestснова (без перекомпиляции файла класса) он по-прежнему печатает старое значение дляINT_VALUEа неVALUE. Например:public class Constants { public static final int INT_VALUE = 2; public static final DisplayValue VALUE = new DisplayValue("X"); }выполнить тест без перекомпиляции
Test.java:Int = 0 Value = Xобратите внимание, что любой другой тип, используемый с
static finalхранится в качестве эталона.похоже на C / C++
#if/#endif, постоянный литерал или один определенный черезstatic finalС примитивы, используемые в обычной Javaifсостояние и оценивает вfalseвызовет компилятор для удаления байтового кода для операторов внутриifблок (они не будут созданы).private static final boolean DEBUG = false; if (DEBUG) { ...code here... }код "...код здесь..."не будет скомпилирован в байтовый код. Но если вы изменили
DEBUGдоtrueтогда было бы.
static final int PROTEINS = 1 ... myArray[PROTEINS]обычно вы ставите "константы" в самом классе. И обратите внимание, что компилятор может оптимизировать ссылки на него, поэтому не изменяйте его, если вы не перекомпилируете все используемые классы.
class Foo { public static final int SIZE = 5; public static int[] arr = new int[SIZE]; } class Bar { int last = arr[Foo.SIZE - 1]; }цикл редактирования...
SIZE=4. Также компилироватьBarпотому что вы компилятор, возможно, только что написал "4" в последнем цикле компиляции!
Java не имеет общего назначения
defineдирективы препроцессора.в случае констант рекомендуется объявить их как
static finals, как вprivate static final int PROTEINS = 100;такие объявления будут встроены компиляторами (если значение является константой времени компиляции).
обратите внимание также, что открытые статические конечные константные поля являются частью открытого интерфейса и их значения не должны меняться (так как компилятор вставляет их). Если вы измените значение, вам нужно будет перекомпилировать все источники, которые ссылаются на это постоянное поле.
здесь препроцессор для Java который предоставляет директивы, такие как #define, #ifdef, #ifndef и многие другие, например команда PostgresJDBC использует его для создания источников для разных случаев и не дублировать код.
самый простой ответ "нет прямого метода его получения, потому что нет предварительного компилятора" Но вы можете сделать это сами. Используйте классы, а затем определите переменные как финал так что можно считать постоянным на протяжении всей программы
Не забудьте использовать final и variable как public или protected not private, иначе вы не сможете получить к нему доступ из-за пределов этого класса
большинство читабельный решение заключается в использовании Статический Импорт. Тогда вы будете не нужно использовать
AnotherClass.constant.создать класс с константой а
public staticполе.package ConstantPackage; public class Constant { public static int PROTEINS = 1; }тогда просто используйте Статический Импорт где вам нужна константа.
import static ConstantPackage.Constant.PROTEINS; public class StaticImportDemo { public static void main(String[]args) { int[] myArray = new int[5]; myArray[PROTEINS] = 0; } }чтобы узнать больше о статическом импорте, пожалуйста, смотрите этот вопрос переполнения стека.
Comments