2013-10-22 22 views
16

最初我使用下劃線_作爲類名。新的Java8編譯器抱怨說在「Java SE 8」之後可能不支持「」。我將其更改爲$,並且不再有任何警告。不過我記得$被Java用來表示字節碼中的內部/嵌入類。我想知道是否有任何風險使用美元符號$作爲一個類名稱

這個問題的一些背景知識。我想要做的是克服Java不支持純函數的事實,而_或$是放置一個名稱空間來封裝一些非常通用的概念(類/靜態方法)。我也沒有一個好的名字,也不希望lib用戶輸入太多的東西來引用這個名字空間。下面是顯示我在做什麼的代碼:https://github.com/greenlaw110/java-tool/blob/master/src/main/java/org/osgl/_.java

+0

它通常是一個壞主意,用類,方法和變量奇怪的名字。在Java小於其他語言(C/C++),但它仍然不是一個好主意,我想。班級名稱應簡要說明其用途。 –

+0

無論如何,我認爲這是好的,如果你知道自己在做什麼。美元沒有特別的意義。它是用來生成嵌套類明確的名稱。因爲沒有兩個類可以在同一個包中存在具有相同名稱的,使用包含類名作爲前綴保證有嵌套不同的第一級類內的類之間沒有重疊。 –

+0

@Pshemo,認真我想我應該公開更多的上下文以避免像你發佈的那樣的評論。我想要做的事情是克服Java不支持純函數的事實,'_'或'$'是放置一個名稱空間來封裝一些非常通用的概念(類/靜態方法)。我也沒有一個好的名字,也不希望lib用戶輸入太多的東西來引用這個名字空間。看看https://github.com/greenlaw110/java-tool/blob/master/src/main/java/org/osgl/_.java –

回答

22

這是不好的風格,並且在Java中的任何標識符中使用$都可能有風險。冒着風險的原因是$字符保留用於使用Java工具鏈和第三方語言工具。

  • 它被Java編譯器用於內部類和嵌套類的「內部」類名中。
  • 它被Java編譯器用於合成屬性的名稱。
  • 它可以被第三方代碼生成器使用(例如,註釋處理器)用於各種目的。
  • 它可以通過靶向JVM平臺其他語言的使用,並且可能需要與您的代碼共存。

對於簡單的$ classname(至少就標準Java工具鏈而言),您可能不會遇到技術問題。但是,總是有這種可能性,這將在未來發生改變:

  • 他們有保留權改變這一點。
  • 沒有在_例如這樣的先例。

如果你真的需要一個字符類名,這將是更好的發揮它的安全和使用FZ或別的東西沒有被保留。

但是誠實的說,我想你會更好試圖實現(或只使用)一個真正的函數式語言比試圖鞋拔功能的編程「系統」爲Java。或者,也許只是在其正式發佈之前切換到Java 8。 '因爲我會爲拒絕來讀取/維護一個看起來像jquery的Java代碼庫。


我並不想創建一個Java功能的lib,只是想創建一個lib,以保持我常用的一些工具。再一次,我是極簡主義的倡導者,並且對apache commons等東西感到厭倦。添加的功能性內容可幫助我更輕鬆地操作集合。

如果這是你的代碼,你可以做你喜歡的事情。做出自己的決定。根據你的意見行事。成爲「風險接受者」... :-)。 (我們關於$的建議等等是沒有實際意義的。)

但是,如果您爲客戶或僱主編寫此代碼,或者想要創建(可行的)開源產品,那麼您需要說明別人的意見。例如,如果您在其他地方找到了更好的付款工作,您的老闆需要知道如何維護您的代碼。一般來說,下一個人能否弄清楚,保留你的代碼,新鮮等等,還是將它寄託在垃圾箱裏?

+1

說真的,我也不喜歡'$',所以我選'_',這給了我一種「默認」的感覺。副詞:最初我並不是要爲Java創建功能庫,只是想創建一個庫來維護我使用的一些常用實用程序。再一次,我是極簡主義的倡導者,並且對apache commons等東西感到厭倦。添加的功能性內容可幫助我更輕鬆地操作集合。 –

+2

@ stephen-c,在原始問題中提到... 18個月前 –

3

嗯,你是對的,在類名作品中使用$。 Eclipse抱怨說它違反了慣例,但是,如果你確定,你可以這樣做。

與使用$在於$是在類層次結構用於指示嵌套類....例如,包含文件A.java問題(常規):

class A { 
    class SubA { 
    } 
} 

會得到編譯成兩個文件:

  1. 的A.class
  2. 一個$ SubA.class

這就是爲什麼,儘管$的作品,這是不明智的,因爲解析的罐子可能會更加困難......你運行碰撞兩個階級,導致其他問題

的風險

編輯,我剛剛做以下兩個Java文件的測試(在默認包)

public class A { 
    private static final class SubA { 
     public String toString() { 
      return "I am initializing Nested SUBA"; 
     } 
    } 

    private static final SubA sub = new SubA(); 
    public A() { 
     System.out.println("What is " + sub.toString()); 
    } 
} 



public class A$SubA { 
    @Override 
    public String toString() { 
     return "I am A$SubA"; 
    } 
} 


public class MyMain { 
    public static void main(String[] args) { 
     System.out.println(new A()); 
     System.out.println(new A$SubA()); 
    } 
} 

和代碼將無法編譯.....

兩個問題,A型$蘇巴已經定義,和ca不要通過二進制名稱引用嵌套類A $ SubA。

+1

這不是我的情況。正如我所說的,我打算使用一個'$'作爲類名。 –

+2

在描述的情況下,這不會成爲問題(只有一個名爲「$」的類) –

+0

@rolfl這是主題。該圖書館努力創造新的東西,但對於那些習慣於傳統JEE世界中的那些第三十章變長或方法名的人來說似乎很奇怪。第一個版本已經投入公司項目的使用和我的一些其他操作系統項目,如(https://github.com/greenlaw110/java-storage)。老實說這不是一個糟糕的經歷。無論如何,我認爲這是一個口味的問題,如果你認爲有很大的問題,請在github中創建一個問題,我會在那裏跟進 –

2

是的,關於回答你的問題要迂腐,有風險。正如其他一些人所提到的,它違反了java命名約定。所以風險在於,未來版本的JDK可能會導致問題。但除此之外,如果你嘗試使用嵌套類,你應該沒問題。

1

您風險醒目驢鞭打是否有人曾經需要讀取或維護你的代碼。

2

我想你想避免像Util.andThen醜名。考慮使用static imports。這樣可以導入標題import static org.ogsl.Util.*中的所有方法,因此您可以簡單地使用andThen而不需要任何前綴。

+0

儘管此鏈接可能會回答問題,但最好在此處包含答案的重要部分,並提供供參考的鏈接。如果鏈接頁面更改,則僅鏈接答案可能會失效。 –

+0

@HarshalPatil:這*看起來包含了這裏的要點:使用像'example'這樣的靜態導入,這裏有更多文檔。 –

相關問題