2016-02-22 92 views
0

我在我的项目中有(java类的)包。哪些需要在某些需求下被删除。 我编译我的项目目标在Java中优化代码

高端

低端

需求约束

  1. 包裹需要在Highend那里,不应该在那里的低端。
  2. 我的代码库是相同的两个目标

为了实现这一目标requiment我想要的方式来定义

class myclass{ 
static final boolean isEnable = false; 
public void API1(){ 
if(isEnabled){ 
//function logic 
} 
} 
public boolean API2(){ 
if(isEnabled){ 
//function logic 
//return value 
} 
else 
return false; 
} 
} 

虽然“静最后的”私有变量提供一个解决方案,以减少我的班级规模是isEnabled代码是错误的。编译器从编译的类中移除字节码。但是使用这个我认为它不会解决我的问题,它减少了低端目标的类大小但是函数持续返回一些默认值。 有没有更好的方法或设计模式解决了这个问题,就像现在的解决方案一样,我必须对包中所有类的所有API进行更改,尽管我必须删除所有完整的包。

这一要求涉及到java包中的Android,所以我把它放置在标签的Android

+0

谷歌的功能切换Android上线一起,找到的东西[像这样](http://www.togglz.org/),这可以做到。注意:我不认可这个,这只是第一个结果。或者,也许你可以为highend api做一些“库”,并有两个版本 –

+0

听起来就像你想要一个预处理器。也许看看[Java中的条件编译选项](https://stackoverflow.com/q/4526113)? – Siguza

+0

我建议配置你的构建工具(gradle,maven,ant,...)来生成两个工件,比如'highend.jar'和'lowend.jar'。唯一的问题是你必须实施API1和API2两次,每个工件一次。 –

回答

0

您可能需要调整你的代码,以便API2被包含在被在低端完全消除类版。此外,由于API2的呼叫者在低端版本中没有得到理智的回答,因此您可能也可以在API2以内消除测试。我的意思是下面

  • 没有人使用含API2
  • 类全班同学被淘汰
  • 该方法不需要isEnabled检查

虽然这听起来不错,请注意,这只是一个设计目标,不要太努力去追随它,这样你就不会以一些疯狂的设计结束。如果有几十个isEnabled检查,那么你(可能)做错了什么。


你也可以使用由高端实现覆盖一个简单的低端实现像

class LowendSomething { 
    boolean doFancyStuff() { 
     throw new BuyTheHighendVersionException(); 
    } 
} 

class HighendSomething { 
    boolean doFancyStuff() { 
     ... do fancy stuff 
    } 
} 

与像

LowendSomething something = 
    isEnabled ? new HighendSomething() : new LowendSomething();