【发布时间】:2017-08-20 12:48:10
【问题描述】:
我正在尝试实现类似于 C# 预处理器的功能。我知道 Java 没有相同的预处理器功能,并且知道使用工厂等设计模式可以实现类似的结果。但是,我仍然有兴趣找到这个问题的解决方案。
目前,我所做的是创建一个包含几个静态最终布尔属性的类,例如以下示例:
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 一无所知。
我想要这样做的原因主要是因为我可能有多个可用的公共接口,例如,一个限制性的,在方法中控制更严格,一个更宽松,允许直接更改属性。但是,我也希望能够从 .class 中主动删除部分代码,例如,在某些变体不可用的产品线开发方法中。
编辑2.:
此外,请务必注意,我还将有条件地生成文档。因此,包的每个编译版本都有自己的文档,仅包含实际可用的文档。
【问题讨论】:
-
好问题 (+1),但我仍然不同意您关于抛出异常粗鲁且无益的结束语。在阅读完您的问题之前,我打算将其发布为答案。抛出一个安全异常正是你应该做的。事实上,Java 已经内置了安全包,它在内部使用这些包来处理这类事情。您可以尝试利用已经存在的安全相关功能,也可以创建自己的特定安全异常。
-
@Aaron 这是有争议的,但确实安全管理器可能是要走的路(如果它支持这个 - 我不知道)
-
如果您的库的用户想要调用一个方法,并且如果该用户可能没有使用该方法的权限,则不应该涉及一些黑魔法。它应该只是
try { securityCheckedMethod(); } catch (AccessException ex) { /* you-don't-have-permission handler */ }的形式 -
或者,如果首选其他方法,也许@FledglingPidgeon 可以详细说明他希望 API 用户如何处理他们无权访问的方法,即使它的描述方式与问题中的
if(FULLACCESS)示例相同。这应该是问题的一部分。 -
为了补充我刚才所说的,关于“黑魔法”,这个想法很简单,就是让 IDE 显示方法在实际上不可用时作为“可用”,似乎没有帮助。然而,再一次,这可能只是我对 Java 一无所知的情况,在这种情况下,可以通过安全异常来解决“许可接口问题”,即使它不允许我主动删除部分代码.class,例如,在某些变体不可用的产品线开发方法中。
标签: java preprocessor processor conditional-compilation