java - 在编译时有条件地删除 Java 方法

标签 java preprocessor processor conditional-compilation

我正在尝试实现类似于 C# 预处理器的功能。我知道 Java 没有相同的预处理器功能,并且知道有一些方法可以使用诸如工厂之类的设计模式来实现类似的结果。但是,我仍然有兴趣找到这个问题的解决方案。

目前,我所做的是创建一个包含几个静态最终 boolean 属性的类,例如以下示例:

public class Preprocessor
{
  public static final boolean FULLACCESS = false;
}

然后我按以下方式使用它:

public ClassName getClassName()
{
    if(Preprocessor.FULLACCESS)
    {
        return this;
    }
    else
    {
        return this.DeepCopy();
    }
}

到目前为止一切顺利,这解决了我的问题(上面的示例很简单,但我确实在其他有帮助的情况下使用了它)。我的问题是,是否有办法围绕整个方法放置条件,以便在给定正确的“预处理器”变量的情况下方法本身不可用?例如,我希望能够使一个特定的构造函数只对被授予“完全访问权限”的包可用,如下所示:

public ClassName()
{
    // do things
}

if(FULLACCESS)
{
public ClassName(ClassName thing)
{
    // copy contents from thing to the object being created
}
}

同样,我知道 Java 作为一种语言的局限性(或设计决策),并且我知道在大多数情况下这是不必要的。事实上,我考虑过简单地创建这些“额外”方法并将它们的整个代码放在一个条件中,同时如果条件不活跃则抛出异常,但这是一个非常粗略的解决方案,似乎没有帮助当我让这些库可供我的程序员使用时。

非常感谢您的帮助。

编辑:

为了补充这个问题,我尝试这样做的原因是,通过使用异常作为解决方案,IDE 会将方法显示为“可用”,而实际上它们并不可用。但是,同样,这可能只是我对 Java 一无所知的情况。

我想要这样做的原因主要是因为我可能有多个可用的公共(public)接口(interface),比如说,一个限制性的方法在方法中控制更严格,另一个更宽松的地方允许直接更改属性。但是,我也确实希望能够主动从 .class 中删除部分代码,例如,在某些变体不可用的产品线开发方法中。

编辑2.:

此外,重要的是要注意我也会有条件地生成文档。因此,包的每个编译版本都有自己的文档,仅包含实际可用的文档。

最佳答案

好吧,你可以实现它。不过请注意...

我只记得有一次我认为这种方法是最好的方法,结果证明我错了。更改类的公共(public)接口(interface)的情况对我来说尤其像是一个危险信号。当访问级别不足以调用方法时抛出异常可能对代码更友好。

但无论如何,当我认为我需要一个预处理器时,我所做的就是写一个。我创建了一个自定义注释以放置在有条件可用的方法上,抓取了一个 Java 解析器并编写了一个小程序,该程序使用该解析器查找和删除具有注释的方法。然后(有条件地)将其添加到构建过程中。

因为结果证明它对我没用,所以我丢弃了我的;而且我从未见过其他人这样做并发表过;据我所知,您必须自己动手。

关于java - 在编译时有条件地删除 Java 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43052722/

相关文章:

java - 在 spring-data-mongodb 中返回 $last 聚合中的对象

java - 从本地用户和 glassfish 到 Mysql DB 的并发连接

java - InputStream 问题 - Android

c++ - 在没有船长的情况下提升精神解析

scikit-learn - 如何从 sklearn.preprocessing.PolynomialFeatures 中删除仅交互列

operating-system - 音乐播放器过程

java - FAIL - 未能在上下文路径/ROOT 部署应用程序。部署 jenkins 的插件部署失败

c# - 如何以编程方式确定我的处理器类型?

c# - 如何确定哪些逻辑核心共享同一个物理核心?

ios - 预处理器循环 '#rep #endrep' 在 Xcode 上不起作用?