2011-07-09 22 views
2

殊不知 - 公共Java類必須放置在自己名字命名的文件[類名]的.java如何將自動生成的Java類放入單個.java文件中?

When java class X required to be placed into a file named X.java?

但是,我們自動生成50多個java類,我想將它們全部放在同一個文件中以方便我們。這將使生成文件變得相當容易,並在需要時複製它們。

有什麼辦法可以解決這個限制嗎?這看起來更像是一種文體上的關注 - 而且我可以用編譯器標誌來禁用它。

如果不是,您會推薦什麼?

+0

他們必須公開嗎? –

回答

4

你可以在你的類中放置包裝類嗎?喜歡的東西:

public class Wrapper { 
    public static class A {...} 
    public static class B {...} 

.... 
} 

然後你就可以通過Wrapper.A訪問它們,Wrapper.B

+0

我可以。這樣做的後果是什麼(除了將它們引用爲Wrapper.A)? – Steve

+0

分支就是你必須在包裝類名稱的前面加上你的類名稱作爲更新的答案。但是如果你自己編碼,那應該沒問題。你甚至可以命名你的包裝類似於包。 –

+0

這很完美。謝謝。 – Steve

2

.class水平,這是每個Java規範的要求。即使是內部類也會從Outer$Inner.class中分裂出他們自己的類文件。我相信在語言層面也是如此。

最好的辦法是生成文件,並使您的副本腳本更加智能。也許生成它們並將其壓縮。通常,如果必須移動這些文件,那麼每個人都有相同的生成器腳本,或者將它們分發爲JAR。

+0

謝謝。我感謝您的幫助! – Steve

+0

安德魯,你看到每個亞歷克斯的迴應使用嵌套的頂級類的任何問題? – Steve

+0

不,這是一個很好的答案。當我啓動我的時候,我正在考慮使用JVM類文件而不是源代碼。 –

1

有沒有什麼辦法可以解決這個限制?

您可以更改生成的源代碼,使其可以接受的;例如通過使用嵌套類,將生成的類放入它們自己的包中。

它似乎更像是一種文體上的關注 - 而且我可以用編譯器標誌禁用它。

這不僅是一個風格的關注:

  • 每類規則中的一個文件是允許由Java語言規範。
  • 這是所有主流的Java編譯器來實現
  • 這是由默認的類加載器行爲的形式,所有主流的JVM實現
  • 這是假設由第三方Java工具;例如IDE,風格檢查器,錯誤檢查器,代碼生成框架等。

簡而言之,雖然從理論上講,實施一個沒有此限制的Java生態系統是合法的,但這是不切實際的。不存在這樣的編譯器開關,並且由於上述原因實施一個將是不切實際的。


嵌套類解決方案是一個很好的解決方案。另一種方法是將生成的類放入一個單獨的包(但帶有單獨的文件),以便於管理。

+0

感謝您的洞察力。限制對我來說非常不尋常。我不認爲我曾經使用過這種限制的語言。這似乎很迂腐。你提到'[這是] Java語言規範允許的',但是,據我所知,這不是規範中的'必需'......所以我很困惑爲什麼每個人都做了*以這種方式實現他們的編譯器,JVM和工具。我不認爲它對任何人都有好處 - 它看起來似乎不會讓工具構建更容易。 – Steve