2014-03-27 42 views
4

如果库不存在,我必须实现一个宏来代替另一个实现的类的实现。原因是用户可能不愿意安装复杂的库(比如说名字是complex.jar)。即使库不存在,代码编译也是非常重要的。用Scala宏替换类实现

实际例子: 考虑例如一个用于计算复杂数学函数的工具。让我们假设我们现在想要添加绘制结果的功能。为此我们使用Matlab(我知道还有其他的,这只是一个例子)。让我们假设Matlab有一个jar文件。由于并非所有用户都安装了Matlab,所以我希望我的代码在没有这个jar的情况下编译,尽管它使用了这个jar中的Methods。

例子:

@ReplaceMeIfLibDoesNotExist("complex","DefaultConnector.scala") 
class ComplexConnector{ 
    import complex._; 
    def connect(){ 
     complex = new ComplexLibrary(); // part of complex.jar 
    } 
} 

class DefaultConnector{ 
    def connect(){ 
     println("Currently not supported. Install complex.jar") 
    } 
} 

将类似的东西的工作?宏实现将如何?还是有一些更优雅的方式做这样的事情?有一个具体的代码示例是很好的。

非常感谢您提前。

+1

我非常喜欢斯卡拉的宏观系统,但这很可怕。 –

+0

你害怕什么意思?这太难了吗?还是不好的风格?你在这种情况下做什么?如果没有宏,你可以做更好的事情吗? – user1729603

+0

这听起来像是你本质上是在欺骗编译器对你和它都知道的事情说“是”,可能会炸毁这条线。这感觉就像是一个糟糕的过去,那就是用运行时从字符串中读取的类名来配置Java程序。 –

回答

0

我不认为宏是适合的 - 宏在编译时动作,而它听起来像你想要改变基于哪些库在运行时可用的功能。我会沿着SLF4J的静态绑定方法提出一些建议 - 通过静态方法加载ComplexLibrary,该方法在base jar中的connector-complex.jar中以不同的方式实现。