2011-12-26 43 views
1

在其中一個大學課程中,我們必須用Java開發程序。其中一項要求是使用surname_firstname_exerciseN_className.java的模式來命名我們的所有文件。另一個要求是我們必須將我們的程序分成多個文件。你可以想象,這兩者並不能很好地配合。公共Java類的名稱與文件名稱不同

我試圖通過「翻譯」我的班級名稱來解決這個問題。例如,如果我寫了一個名爲「東西」類,我這樣做,我long_prefix_something.java文件:

public class long_prefix_something extends Something {} 

class Something { 
    // class code 
} 

而且我想用類的東西在另一個文件中。所以,我這樣做是其他的文件:

class Something2 extends long_prefix_something { } 

讓我困擾的是,我不能因爲循環繼承錯誤的翻譯long_prefix_somethingSomething,我必須使用Something2代替。

有沒有辦法解決這個問題?任何使用註解或類似的東西?

+4

能否請你描述你的限制,你將需要使這樣的事情? – ziesemer 2011-12-26 17:40:22

+1

他只是想用漂亮的類名來代替醜陋的類名,在我看來。 – AHungerArtist 2011-12-26 17:48:04

+0

另外,我很想知道是什麼導致被迫使用這樣一個愚蠢的約束。 – AHungerArtist 2011-12-26 17:48:34

回答

0

不,這在Java中是不可能的。

擴展將無法正常工作,並且似乎您想要的別名在Java中不存在。

1

這種攻擊的必要性通常是設計不好的標誌。 java中不允許循環(和多重)繼承。

1

我同意(與其他評論者)這聽起來有點可怕......但是,儘管如此,在處理類似於你的問題時存在一些Java約定。

看起來您需要的類是「更具描述性」的內部 派生,然後繼承層次結構中的標準Java類。

您可以通過兩種標準方式滿足您的需求:接口(編譯時)或反射(運行時)。

雖然因爲你似乎在這裏有一個非常複雜的代碼情況下的精確解不明確, 兩個例子可以解決你所遇到的問題:

第一種方法:通過使用接口。

1)轉換「東西」到一個界面 2)採取從implmentation方法和它們移植到一類SomethingImpl 3)只要有「abcde12345_something」落實「東西」界面。

第二種方法:通過使用introspecting的類。

這是一種有點奇怪的方法,但是如果接口不起作用,您可以在類中添加更多鉤子,以允許它向其他對象描述它從哪個類型派生而來。

1)很顯然,你是「包裝」類 - 所以,你可以一個API添加到您的包裹類,使得每一個提供「getRootClass()」方法,像這樣:

public class abcde_12345_something extends Something implements RootClassProvider{ 
    public Class getRootClass() 
    { 
     return Something.class; 
    } 
} 

2)現在,在運行時 - 如果你不能(因爲某些原因)時,你需要做的「東西」的對象特殊的邏輯操作,可以 通話

if(myabcd_12345.getRootClass().isAssignableFrom(Something)) 
    Something s = (Something) myabcd_12345; 
1

我認爲最好的辦法做他們打算做的是使用包,而不是混亂的類名...我' ð認爲你的老師,如果我是你:

即surname_firstname.exerciseN.ClassName代替surname_firstname_exerciseN_className.java

相關問題