Эквивалент #define в Java? - PullRequest
       54

Эквивалент #define в Java?

8 голосов
/ 22 декабря 2009

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

В C это будет достаточно просто с #define в заголовке, а затем с кодовыми блоками, окруженными #ifdefs. Конечно, в Java нет препроцессора C ...

Для уточнения - несколько внешних библиотек будут распространяться вместе с моей. Я не хочу включать их все, чтобы минимизировать мой размер исполняемого файла. Если разработчик включает библиотеку, я должен иметь возможность использовать ее, а если нет, то ее можно просто проигнорировать.

Каков наилучший способ сделать это на Java?

Ответы [ 12 ]

0 голосов
/ 22 декабря 2009

В зависимости от того, что вы делаете (недостаточно информации), вы можете сделать что-то вроде этого:

interface Foo
{
    void foo();
}

class FakeFoo
    implements Foo
{
   public void foo()
   {
       // do nothing
   }
}

class RealFoo
{
    public void foo()
    {
        // do something
    }
}

и затем предоставьте класс для абстрагирования экземпляра:

class FooFactory
{
    public static Foo makeFoo()
    {
        final String   name;
        final FooClass fooClass;
        final Foo      foo;

        name     = System.getProperty("foo.class");
        fooClass = Class.forName(name);
        foo      = (Foo)fooClass.newInstance();

        return (foo);
    }
}

Затем запустите Java с -Dfoo.name = RealFoo | FakeFoo

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

Таким образом, вы компилируете обе версии подклассов Foo и позволяете разработчику выбирать во время выполнения то, что они хотят использовать.

0 голосов
/ 22 декабря 2009

Используйте свойства, чтобы делать подобные вещи.

Используйте такие вещи, как Class.forName, чтобы идентифицировать класс.

Не используйте операторы if, если вы можете тривиально перевести свойство непосредственно в класс.

...