Реализуйте #ifdef в Java - PullRequest
       30

Реализуйте #ifdef в Java

4 голосов
/ 16 марта 2012

У меня есть алгоритм, написанный на C, и в нем есть код, который может обрабатываться препроцессором C, но поскольку в Java нет препроцессора, я не знаю, как написать код Java для такой обработки. Код C

#ifdef Tile_size_utility
#define print_error 0
else
#define print_error 1
#endif

Как я могу реализовать это на Java?

Ответы [ 5 ]

3 голосов
/ 16 марта 2012

Мы не можем перевести его на Java.Мы должны проанализировать, где установлено свойство (Tile_size_utility) и где нам нужно print_error.Затем мы можем реализовать эквивалентное решение.

Пример: при условии, что Tile_size_utility является системным свойством (устанавливается в среде), и нам нужно PRINT_ERROR в качестве (логического) флага, тогда это должно сработать:

public class MyClass {

  public final static boolean PRINT_ERROR = 
            (System.getProperty("Tile_size_utility") != null);

}

Теперь, если вы наберете set Tile_size_utility=myutiliy или начнете java с аргумента

-DTile_size_utility=myutiliy

, тогда PRINT_ERROR будет установлен на true.

1 голос
/ 16 марта 2012
 Class ErrorVerbose { 
          private static boolean enabled = False;

          public static setEnable(boolean enable) 
                enabled = enable;
          }

          public static perror(String msg) {

               if (enabled) {
               /* Print */ 
               }

          }
   }


 class YourClass {

           public YourClass(....,boolean status) {

                ErrorVerbose.SetEnable(status)
                    .
                    . 
           }

   }

Ну, да, вы можете сделать либо нестатический класс, так что другие классы могут включать / отключать многословный.Преимущество создания класса ErrorVerbose заключается в том, что вы добавляете больше информации, такой как время, дата, имя функции (которая вызвала) и т. Д., Что делает его более информативным. Я только что дал скелет.

1 голос
/ 16 марта 2012

Вы не можете.

Но у Java есть наследование и полиморфизм. Вы можете использовать эти концепции вместе с шаблоном внедрения зависимостей, чтобы решить проблему более четко, но по-другому.

Я могу дать вам более точный ответ, если вы опубликуете подробности о том, что делает print_error.

0 голосов
/ 16 марта 2012

JVM динамически компилирует код в собственный, поэтому эти параметры можно изменить во время выполнения и получить практически одинаковую производительность.

Вероятно, вы обнаружите, что многие из приемов, поддерживаемых C ++, не нужны в Javaпоскольку у него есть другие решения проблемы, которые оставлены на усмотрение JVM.Java, как правило, имеет плохую функциональность по сравнению с другими языками, но то, что он имеет, сильно оптимизировано таким образом, что может удивить некоторых разработчиков.

0 голосов
/ 16 марта 2012

Создайте DefineManger, используя:

abstract public class DefineManager {
    abstract public boolean isDefined(String k);
    abstract public String  getDefine(String k);
    abstract public void    setDefine(String k, String v);
    abstract public void     undefine(String k);
}

if (isDefined("Tile_size_utility")) {
  setDefine("print_error", "0");
}
else {
  setDefine("print_error", "1");
}
...