背景:我使用Google Guice,因此通過配置類更容易,但我認爲這不是最好的方法。配置類 - Guice的最佳實踐
我有存儲一些路徑的配置類:「A」,這需要「HOMEPATH」和「B」類,其需要「userpath」
class Configuration{
String getHomePath();
String getUserPath();
}
另外我有一個類。
將配置類傳遞給類a和b的構造函數還是隻傳遞給特定的路徑會更好嗎?
背景:我使用Google Guice,因此通過配置類更容易,但我認爲這不是最好的方法。配置類 - Guice的最佳實踐
我有存儲一些路徑的配置類:「A」,這需要「HOMEPATH」和「B」類,其需要「userpath」
class Configuration{
String getHomePath();
String getUserPath();
}
另外我有一個類。
將配置類傳遞給類a和b的構造函數還是隻傳遞給特定的路徑會更好嗎?
根據您的具體情況,您的問題沒有單一的答案,只有可供選擇的選項。
如果你知道你的Configuration
類是要長大和,如果它有可能爲你A
和B
類將使用更多來自它,那麼整個Configuration
對象傳遞給它們的構造。注:我知道這是對YAGNI原則,但有時你可能知道你會需要它;-)
否則,讓你減少A
和B
類依賴於你可以考慮使用@Named
注入你的路他們最低限度,這是一個很好的設計實踐。
一般規則是使依賴關係圖(哪些類知道或依賴於其他類/接口)儘可能簡單,規則和固定的代碼。
如果不通過配置類使a或b對用戶編寫的類沒有依賴關係,或者爲避免依賴關係循環,則使用單個路徑字符串。否則,如果說'這個班級有權訪問配置信息,以一種可能在將來會改變的方式'更合理,請通過班級。
我會避免單例方法,特別是如果你已經有Guice設置。
如果你真的正確使用Guice,你所有的配置都應該出現在模塊的configure
方法中。所以:
HomePath
和UserPath
。getHomePath()
將其替換爲名爲homePath的String字段成員。getUserPath()
將其替換爲名爲userPath的String字段成員。@Inject
進行了註釋(應該已經是)並帶入一個字符串參數,分別用@HomePath
和@UserPath
註釋,並指定注入值的String字段成員。.annotatedWith()
創建綁定,這些綁定定義了正確的值;如果它們僅在運行時可用,則綁定提供者。E.G.
class a {
private String homePath;
@Inject
public a(@HomePath String homePath) {
this.homePath = homePath;
}
public String tellMeAboutHome() {
return "We live in a nice home called " + homePath;
}
}
class customModule extends AbstractModule {
public static final String userPath = "/home/rafael";
public void configure() {
bind(String.class).annotatedWith(HomePath.class).to("/home/");
bind(String.class).annotatedWith(UserPath.class).to(userPath);
}
}
如果創建的註釋是對你工作太多了,使用@Named標註吉斯ships with。