2014-03-27 77 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中以不同的方式實現。