Java J2ME-在一个项目中支持不同的平台

Java J2ME-在一个项目中支持不同的平台,java,java-me,project,Java,Java Me,Project,我正在用J2ME开发一个应用程序,它将部署在不同的平台上(所有平台都支持J2ME) 对于UI,我将使用LWUIT,并确保它在每个平台上呈现大致相同的效果。(LWUIT是跨平台的) 我知道每个平台都有自己的细微差别,例如图书馆的可用性/缺乏,我想知道是否最好的行动方案是 A) 为每个平台创建一个新项目(例如一个用于Blackberry,一个用于Nokia),并在它们之间复制和粘贴类似的可重用代码;基本上一次维护4-5个相似的代码基 或 B) 有一个大项目充满了“if”或“switches”的说法(

我正在用J2ME开发一个应用程序,它将部署在不同的平台上(所有平台都支持J2ME)

对于UI,我将使用LWUIT,并确保它在每个平台上呈现大致相同的效果。(LWUIT是跨平台的)

我知道每个平台都有自己的细微差别,例如图书馆的可用性/缺乏,我想知道是否最好的行动方案是

A) 为每个平台创建一个新项目(例如一个用于Blackberry,一个用于Nokia),并在它们之间复制和粘贴类似的可重用代码;基本上一次维护4-5个相似的代码基

B) 有一个大项目充满了“if”或“switches”的说法(如果platform==x,那么就做xx)

有谁能告诉我,如果上面有一些严重的愚蠢的疏忽,我不会接受?我倾向于实现A,但我认为两者都存在一些可维护性问题

非常感谢


Fenix

维护多个代码库是大多数开发人员喜欢避免的事情

Afaik大多数开发人员使用预处理器,这基本上允许您在代码中使用大量if语句,而不会使jar文件变大

我在所有JavaME游戏项目中都使用了预处理,以便能够用一个代码库编译到多个目标

//#if ScreenWidth==240
tilesize = 16;
spriteSheet = Image.createImage("sprites16x16");
//#endif
//#if ScreenWidth==640
tilesize = 32;
spriteSheet = Image.createImage("sprites32x32");
//#endif
您可能没有听说过预处理,因为它通常不用于Java。但将其用于JavaME是有意义的,因为设备中存在碎片。我也希望能够在Android项目中使用预处理,但遗憾的是这(还)不可能

不过,其他一些小事情,如诺基亚UI的出现,则不需要进行预处理。只需使用classForname检查类是否存在,如果存在,则将布尔值设置为true。然后在代码中使用此布尔值检查是否应该执行某段代码。 (例如,我使用诺基亚UI API使屏幕保持活动状态,因为此API存在于诺基亚和索尼爱立信设备上)

然后在我的游戏循环中:

if (nokiaui) {
  com.nokia.mid.ui.DeviceControl.setLights(0, 100);
}

你也可以把这样的东西放到预处理块中,但是你会错过那些可能支持它的设备

您可以从LWUIT获得灵感,因为您已经提到了它()。这是一个庞大的代码库,需要时间来遵循它。其主要思想是模块化项目,并通过接口和实现隐藏特定于平台的细节。并在运行时或编译时通过依赖注入对其进行配置

例如,您有一个将通过http与服务器通信的
客户机
类。因此,您可能会有下一个结构:

common
  Client
  Network

j2me
  J2MENetwork extends Network
  J2MEMidlet
blackberry
  BlackBerryNetwork extends Network
  BlackBerryApp
因此,
网络
将是一个抽象类,并且将具有一些关于通过重试构造URL的通用逻辑。BlackBerryNetwork将使用特定于平台的API进行网络通信<代码>客户端将在
J2MEMidlet
BlackBerryApp
中注入正确的实现

据通知: 1) 不要复制你的代码。维护一个代码库 2) 我非常反对预处理。因此,如果根本无法避免,请尝试将所有预处理集中在一个或两个工厂类中


祝你好运,并致以最良好的祝愿

奖励:在我之前参与的一个iPhone项目中,我们使用了大量的if语句支持不同版本的平台,所以这就是这个想法的来源。如果我是你,我会使用“a”而不是“B”,因为它会减少整个jar文件的大小。此外,我还看到了一些依赖于平台的内容。感谢您的回复。当然,使用构建工具为不同的平台编译不同的JAR不是问题。我的问题更多的是代码组织。至于罐子的大小,我不相信它会成为这种情况下的一个因素(由于完全混淆)。我可能会带着深思熟虑的想法和一些非常可靠的建议去做!我将采用这种策略(多个代码库可能会在一段时间后让我恼火)。至于预处理器,实际上我来自Obj-C背景,所以我对它们非常熟悉,但是我觉得Java不支持预处理器。无论如何,谢谢你的回答,我会接受你的回答。我刚刚遇到一个问题。。我需要为不同的平台使用不同的JAR库(特别是LWUIT)。Netbeans中的AFAIK不可能使用预处理来指定要使用哪些jar。有什么想法吗?预处理会让你的生活陷入地狱和无尽的调试要为不同的目标使用不同的JAR库,你必须首先创建不同的配置。转到项目属性,然后管理配置。创造一些。然后在库和资源中,您可以为不同的配置选择不同的库。(您可以在预处理语句中使用相同的配置)。您好。谢谢你的回复!我正在考虑将我的类文件隔离在平台之外,并按照您所说的在需要时进行依赖注入。你说“我真的反对预处理”,为什么是出于好奇?许多人反对代码中隐含的一切。预处理使代码变得复杂,以不可预测的方式修改程序流。这很难维持。导航和遵循代码是很困难的,尤其是当你在日食中生活和学习的时候。谢谢如果你感兴趣的话,我推荐的解决方案是:为高内存平台制作一个应用程序的高级UI版本,并使用依赖注入实现平台细节。并制作一个支持最大兼容性的低级UI版本。两个代码基,但希望它涵盖所有的代码基。再次感谢
common
  Client
  Network

j2me
  J2MENetwork extends Network
  J2MEMidlet
blackberry
  BlackBerryNetwork extends Network
  BlackBerryApp