2010-03-03 110 views
4

嗨大家好,我是第一個真正的工作機會(令人興奮)的大學畢業生。我現在正處於他們需要看到一個編程示例的階段,他們給了我用Java實現隨機數字生成器服務的任務,有兩個不同的實現(一個使用內置的東西和另一個我的選擇) 。該代碼是比較容易的部分,但任務的一部分是混淆了我......這就是:在不用Java重新編譯的情況下添加實現?

由於評價者,我應該能夠做到以下幾點: 與考生編譯我自己的項目jar文件。 註冊我的解決方案與候選人可執行jar。 運行應用程序可執行jar,以某種方式告訴它運行我的實現。

基本上我做我的代碼轉換成可執行的.jar和

評估應該能夠使用由候選人開發的代碼和編譯的類在自己的隨機數發生器實現插而無需重新編譯候選人的代碼。

這是什麼意思?也許我只是錯過了明顯的東西?我不知道如何讓他們無需重新編譯所有內容就可以投入自己的實現......希望這不是一項太大的任務,因爲我在大學裏沒有聽說過這樣的事情(我認爲) 。

任何幫助/見解都非常感謝!

+4

看看'ServiceLoader'類:http://java.sun.com/javase/6/docs/api/java/util/ServiceLoader.html –

+0

@Joachim:Shouldn這不是一個回答,而是一個評論? –

+0

@Aaron:可能......隨意讓它變成一個;-) –

回答

10

我認爲這意味着您應該提供一個RandomNumberGenerationStrategy接口作爲公共API的一部分,以便評估者可以實現。

然後提供另一個鉤子,他可以註冊他的接口的特定實現,然後通過回調調用它。

+2

像-DRandomNumberStrategy = my.own.random.impl.MyGenerator這樣的簡單vm參數將提供此功能。您可以在您自己的代碼中使用該值來實例化並執行它。 – Robin

+0

@Robin更好......使用commons-discovery來實例化並執行它。 –

+0

感謝您的想法,我一定會在今晚看到他們!快速提問/澄清:「登記」到底是什麼意思?簡單地找到一種方法,以便他可以告訴主調用類使用他的實現? 至於commons-discovery部分,他們希望我只使用默認與JRE捆綁在一起的工具,所以一個接口可能就是要走的路... –

5

他們希望您使用URLClassLoadersee the docs)加載實現JAR,然後使用反射實例化主類並調用調用隨機數生成器的正確方法。

1

使用Spring並利用ClassPathXmlApplicationContext通過Spring配置交換您的實現。你的Spring配置應該看起來類似於:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd"> 

<beans> 
    <bean id="randonNumberGenerator" class="com.me.MyGenerator"/> 

    <!-- 
    <bean id="randonNumberGenerator" class="com.someoneelse.ADifferentGenerator"/> 
    --> 
</beans> 

在你的程序中,加載你的Spring上下文並查找bean。

ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext(new String[]{"applicationContext.xml"}); 
IGenerator generator = applicationContext.getBean("randonNumberGenerator"); 

// IGenerator in the interface which MyGenerator and ADifferentGenerator implement 

記住你的Spring配置文件應該在classpath中存在(不只是你的罐子裏),所以它可以在運行時更改,而不重新編譯。

+0

嗯,有趣。他提到他們喜歡在其中一次採訪中使用Spring框架,所以或許我會檢查一下,謝謝。 –

0

看看OSGi frameworkEclipse使用。例如,Eclipse能夠加載新的插件並主動將它們插入到運行環境中以便立即使用(無需重新啓動即可應用)。你可以做到完全一樣。

+0

嗯...他們要求一個簡單的事情,而不是熱切換服務的企業環境。正如Kevin Pauli和Aaron所說,反思和戰略模式就足夠了。 – helios

0

嗯,也許爲了讓這個過程更簡單一些,他們沒有給你提供你應該實現的類和方法原型的名稱嗎?我認爲這是最合乎邏輯和直接的方式之一...就像我們的學校教授給我們一些任務,並且他要求我們的程序應該能夠使用他提供的驅動程序類來運行,他通常會設置我們應該實施的類的名稱以及方法的原型。 。只是一個想法...

+0

沒有,他們只是說「實現一個隨機數字生成器服務」使用兩種方式,一種使用內置的Java工具(Random,SecureRandom等),另一種使用我選擇的算法,並且也允許評估者添加他們的實現,所以沒有給出名字不幸的。 –

相關問題