Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Macros in Java?

Tags:

java

I know there are no macros in Java, but is there a workaround to do something like this:

#ifdef _FOO_FLAG_
import com.x.y.z.Foo;
#else
import com.a.b.c.Foo;
#endif

Both Foo classes have the same methods. One of them is from a 3rd party library. I want to be able to switch to default library easily by changing a single line of code. Is this possible?

EDIT:
Both classes are out of my control(one of them is from SQLCipher for Android project, other one is from Android SDK). I need this because SQLCipher library doesn't work on SAMSUNG phones at the moment.

like image 478
Caner Avatar asked Oct 27 '11 10:10

Caner


1 Answers

No, there is no commonly used pre-processor in Java (although you could use the C preprocessor on your Java code, but I'd discourage it, as it would be very unusual and would break most tools that handle your code). Such selections are usually done at runtime rather than compile-time in Java.

The usual Java-way for this is to have both classes implement the same interface and refer to them via the interface only:

IFoo myFoo;
if (FOO_FLAG) { // possibly a public static final boolean
  myFoo = new com.x.y.z.Foo();
} else {
  myFoo = new com.a.b.c.Foo();
}

If this is not possible (for example if at least one of the Foo classes is not under your control), then you can achieve the same effect by an abstract FooWrapper class (or interface) with two different implementations (XYZFooWrapper, ABCFooWrapper).

like image 62
Joachim Sauer Avatar answered Sep 18 '22 07:09

Joachim Sauer