簡體   English   中英

如何為不同的SDK目標管理同一類文件的多個版本?

[英]How to manage multiple versions of same class file for different SDK targets?

這是針對Android應用程序的,但是由於我不知道通常是如何實現的,因此我將問題擴展到Java。

假設您有一個針對特定SDK版本的項目。 新版本的SDK向后不兼容,並且需要在一個類中更改三行。

在Java中如何在不復制任何代碼(或復制最少的代碼)的情況下進行管理? 我不想為三個不同的行創建兩個項目。

最后,我想要實現的是一個適用於兩個版本的可執行文件。 在C / C ++中,您將基於版本定義#define 如何在Java中實現同一目標?

編輯 :閱讀有關#define的評論后,我意識到有兩個問題要合並為一個:

  • 因此,第一個問題是,如何不重復代碼? 那里的構造等效於C中的#define
  • 第二個是:是否可以將所有內容捆綁在同一可執行文件中? (這與第一個問題無關)。

這在很大程度上取決於不兼容。 如果只是簡單的行為,則可以檢查java.version系統屬性並相應地分支代碼(對於三行代碼,就像if語句一樣簡單)。

但是,如果缺少類或類似的東西而在加載類時或代碼接近執行時會引發錯誤(不一定是可以在調用之前通過檢查合理地放棄的東西),那么解決方案將好多了 從代碼的角度來看,擁有單獨版本的概念是最干凈的,但這確實意味着您必須分發兩個版本。

另一個解決方案是反射。 不要直接引用該類,而是通過反射來調用它(測試方法或類以確定您當前正在哪個環境中執行這些方法)。 這可能是反映存在的“正式”方法,以處理您在編譯時沒有或不知道將要擁有的類。 它僅適用於JDK中的庫。 但是,它變得非常丑陋。 對於三行代碼,這是可以的,但是做大量的事情都會變得很糟糕。

我能想到的最后一件事是編寫共同的分母代碼-即可以同時完成這兩項工作的代碼,找到另一種方法來完成,而不會觸發有問題的類或方法。

我會將需要不同的代碼隔離在一個單獨的類中(或在必要時使用多個類),並在為不同版本構建項目時包括/排除它們。

所以我想要src / java / org / myproj / Foo.java是常見的東西,然后是oldversion / java / org / myproj / Bar.java和newversion / java / org / myproj / Bar.java是使用更改的api的類的不同實現。

然后我要么編譯“ src / java和oldversion / java”,要么編譯“ src / java和newversion / java”。

可能是類似的情況,我有一個方法在JDK的先前版本中不可用,但是如果有,我想稱呼它,但是我不想強迫人們使用最新版本。 我用反射來尋找方法,如果有的話我就叫它,如果不是的話我就叫它。

蠻笨拙的,但可能會給您您想要的東西。

總體上講Java,我看到兩種主要方法。

1)。 將特定代碼重構為其自己的庫。 具有該庫的不同版本。 實際上,您的應用正在不同的SDK之上創建摘要。 具有3行代碼的重量級代碼,但對於較大規模的問題而言可能很合理。

2)。 使用注解進行注入。 編寫自己的注釋處理器來管理適當的注入。 工作更多,但可能會更有趣。

使用同一接口將不同類中的更改代碼分開。 將類放在同一罐子中。 使用工廠設計模式根據SDK版本實例化一個或另一個類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM