#define в Java



Я начинаю программировать на Java и мне интересно, если эквивалент C++ .



быстрый поиск google говорит, что это не так, но может ли кто-нибудь сказать мне, Существует ли что-то подобное
на Яве? Я пытаюсь сделать мой код более читабельным.



вместо myArray[0] Я хочу иметь возможность писать myArray[PROTEINS] например.

641   7  

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 С примитивы, используемые в обычной Java if состояние и оценивает в 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

    Ничего не найдено.