Ich sehe Sie hier zwei einander ausschließende Probleme angeben (oder, wahrscheinlicher, haben Sie eine gewählt und ich verstehe nur nicht, welche Wahl Sie getroffen haben).
Sie müssen wählen: Versenden Sie zwei Versionen Ihres Quellcodes (einen, wenn die Bibliothek existiert, und einen, wenn dies nicht der Fall ist), oder versenden Sie eine einzelne Version und erwarten, dass sie mit der Bibliothek funktioniert wenn die Bibliothek existiert.
Wenn Sie möchten, dass eine einzelne Version die Existenz der Bibliothek erkennt und diese, falls verfügbar, verwendet, dann MÜSSEN Sie den gesamten Code für den Zugriff auf Ihren verteilten Code haben - Sie können ihn nicht ausschneiden. Da Sie Ihr Problem mit der Verwendung einer #define gleichsetzen, nahm ich an, dass dies nicht Ihr Ziel war - Sie möchten 2 Versionen versenden (Die einzige Möglichkeit, #define kann funktionieren)
Also, mit 2 Versionen können Sie eine Bibliothek definieren . Dies kann entweder ein Objekt sein, das Ihre Bibliothek umschließt und alle Aufrufe an die Bibliothek für Sie oder eine Schnittstelle weiterleitet - in jedem Fall MUSS dieses Objekt zur Kompilierzeit für beide Modi vorhanden sein.
public LibraryInterface getLibrary()
{
if(LIBRARY_EXISTS) // final boolean
{
// Instantiate your wrapper class or reflectively create an instance
return library;
}
return null;
}
Nun, wenn Sie Ihre Bibliothek verwenden möchten (Fälle, in denen Sie ein #ifdef in C hätte) haben Sie diese:
if(LIBRARY_EXISTS)
library.doFunc()
Bibliothek ist eine Schnittstelle, die in beiden Fällen existiert. Da es immer durch LIBRARY_EXISTS geschützt ist, wird es kompiliert (sollte niemals in Ihren Klassenlader geladen werden - aber das ist implementierungsabhängig).
Wenn Ihre Bibliothek eine vordefinierte Bibliothek ist, die von einem Drittanbieter bereitgestellt wird, müssen Sie möglicherweise Library eine Wrapper-Klasse erstellen, die ihre Aufrufe an Ihre Bibliothek weiterleitet. Da Ihr Bibliothekswrapper niemals instanziiert wird, wenn LIBRARY_EXISTS false ist, sollte er nicht einmal zur Laufzeit geladen werden (Heck, es sollte nicht einmal kompiliert werden, wenn die JVM schlau genug ist, da sie immer durch eine letzte Konstante geschützt ist.), Aber denken Sie daran dass der Wrapper in beiden Fällen zur Kompilierzeit verfügbar sein muss.
Ich glaube nicht, dass das ist, was er sucht. Er möchte keine symbolischen Konstanten, sondern ein Äquivalent zur bedingten Kompilierung. Da ich Java nicht kenne, habe ich keine Ahnung ... – dmckee
was ist mit der bedingten Kompilierung? Wie machst du das in Java? – Russell
Der Artikel, den ich verlinkt habe, bespricht dies. –