【问题标题】:Platform dependent code for several platforms in JavaJava中多个平台的平台相关代码
【发布时间】:2016-02-02 15:47:48
【问题描述】:

我正在编写应该在 Linux 和 Windows 操作系统上运行的程序。

if (isLinux) {
    // some linux code
} else {
    // some windows code
}

它使用平台相关的代码和库,因此目前无法在 Linux 上编译。如何只编译当前操作系统代码的一部分?

【问题讨论】:

  • 请贴出相关代码
  • Windows 的 JNA 方法设置前台窗口和 Linux 的“xdotool”调用。当我在 Linux 上编译时,它当然找不到 Windows JNA。但我也对不特定于我当前代码的解决方案感兴趣。

标签: java platform


【解决方案1】:

创建接口:

interface OSSpecificStuff {
    void method(...)

然后创建该接口的两种实现,一种用于 Windows,一种用于 Linux。

class LinuxStuff implements OSSpecificStuff {
    void method(...) {
        Linux specific implementation

对于 WindowsStuff 等类也是如此。为避免编译错误,请将这些 O/S 特定类编译成单独的 jar 文件。

使用以下方法创建适当的类:

Class clazz = isLinux ? Class.forName("LinuxStuff") : Class.forName("WindowsStuff");
OSSpecificStuff stuff= (OSSpecificStuff ) clazz.newInstance();

或者您可以只创建两个名为 OSSpecificStuff 的类并将它们放在两个不同的 jar 文件中,并在运行程序时在类路径中包含适当的 jar 文件。

高级的东西:

你会发现很多 SE 的帖子都是关于 Class.newInstance 的坏处,你可能想改用 Constructor

另外,为了简单起见,我没有在上面的代码中使用泛型。

Why is Class.newInstance() “evil”?

【讨论】:

    猜你喜欢
    • 2016-08-17
    • 2014-12-26
    • 2014-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-17
    • 2016-01-14
    • 1970-01-01
    相关资源
    最近更新 更多