Переменные препроцессора в Java - PullRequest
3 голосов
/ 09 мая 2011

Я работаю с GWT и делюсь базой кодов с разработчиком Android. Некоторые функции, которыми мы хотим поделиться, принимают специфические аргументы, такие как «Drawable» в Android и «Image» в GWT.

Можно ли использовать переменную препроцессора, как в C ++:

#ifdef ANDROID
public void DrawImg(Drawable img);
#elif GWT
public void DrawImg(Image img);
#endif

Решение, которое мы тестируем, является общим:

interface DrawImgInterf<T extends Object> {
    public void DrawImg(T img);
}

Однако использование переменной preproccesor выглядит лучше. Есть ли такая вещь в Java?

Ответы [ 5 ]

4 голосов
/ 09 мая 2011

Нет, в обычной Java нет ничего подобного.Конечно, вы можете запустить препроцессор, но это усложнит разработку кода.(Что-то вроде IDE, которая ожидает, что код будет «нормальным» Java, может запутаться.)

Рассматривали ли вы вместо этого использование интерфейса, который абстрагирует общие операции и связывается с соответствующим реальным типомво время исполнения?Это не всегда работает (поскольку добавление прокси-сервера нарушает ситуацию, когда важна идентификация объекта), но в некоторых случаях это может быть полезно.

2 голосов
/ 09 мая 2011

Нет, в Java нет переменных препроцессора.

1 голос
/ 30 марта 2013

для таких случаев это лучший способ использовать препроцессор, который я использовал для своих разработок J2ME http://code.google.com/p/java-comment-preprocessor/wiki/ExampleOfUsageForJ2ME

1 голос
/ 21 марта 2013

Java + - препроцессор, который может выполнять подстановку с использованием пакетов ресурсов:

public static void 
main(String[] args)
{
  System.out.println({{
The answer,
my dearest, 
is {{computeAnswer()}}.
  }});
}
static String computeAnswer()
{
  return {{my computed answer}};
}

Ссылки

0 голосов
/ 09 мая 2011

Использование Шаблон посетителя здесь, имеет смысл для меня. Например,

interface ImageVisitor {
    void visit(GWTImage image);
    void visit(AndroidImage image);
}

interface IImage {
    void accept(ImageVisitor visitor);
}

class GWTImage implements IImage {
    ..
    public void accept(ImageVisitor visitor) {
        visitor.visit(this);
    }
    ..
}

class AndroidImage implements IImage {
    ..
    public void accept(ImageVisitor visitor) {
        visitor.visit(this);
    }
    ..
}

class GWTImageVisitor implements ImageVisitor {    
    public void visit(GWTImage image) {      
        Image img = image.getImage();
        ..
    }
}

class AndroidImageVisitor implements ImageVisitor {    
    public void visit(AndroidImage image) {      
        Drawable drawable = image.getDrawable();
        ..
    }
}
...