2013-10-22 10 views
16

Originariamente stavo usando il trattino basso _ come nome di classe. Il nuovo compilatore Java8 si lamenta del fatto che "potrebbe non essere supportato dopo Java SE 8". L'ho modificato in $ e non c'è più alcun avviso. Tuttavia ricordo che $ viene utilizzato da Java per indicare una classe interna/incorporata nel codice byte. Mi chiedo se ci sia qualche rischio di usare il simbolo del dollaro $ come nome di classe

Qualche sfondo a questa domanda. Quello che voglio fare è superare il fatto che Java non supporta la pura funzione, e _ o $ è mettere uno spazio dei nomi per incapsulare un concetto molto generico (classi/metodi statici). e nemmeno io ho un buon nome per questo, né voglio che il tipo di utente lib faccia troppe cose per fare riferimento a quel namespace. Ecco il codice che mostra cosa sto facendo in questo modo: https://github.com/greenlaw110/java-tool/blob/master/src/main/java/org/osgl/_.java

+0

In genere è una cattiva idea usare nomi strani per classi, metodi e variabili. In Java meno di altri linguaggi (C/C++), ma non è una grande idea, penso. Il nome di una classe dovrebbe descrivere brevemente il suo scopo. –

+0

Comunque, penso che sia ok, se sai cosa stai facendo. Il dollaro non ha un significato speciale. Viene utilizzato per generare nomi univoci per le classi nidificate. Poiché non esistono due classi nello stesso pacchetto con lo stesso nome, l'utilizzo del nome della classe contenente come prefisso garantisce che non vi siano sovrapposizioni tra le classi annidate all'interno di classi di primo livello diverse. –

+0

@Pshemo, seriamente penso che dovrei esporre più contesto per evitare commenti come quello che hai postato. La cosa che voglio fare è superare il fatto che Java non supporta la pura funzione, e '_' o' $' è mettere uno spazio dei nomi per incapsulare un concetto molto generico (classi/metodi statici). e nemmeno io ho un buon nome per questo, né voglio che il tipo di utente lib faccia troppe cose per fare riferimento a quel namespace. Controlla https://github.com/greenlaw110/java-tool/blob/master/src/main/java/org/osgl/_.java –

risposta

22

È uno stile dannoso e potenzialmente rischioso per utilizzare $ in qualsiasi identificativo in Java. La ragione per cui è rischioso è che il carattere $ è riservato all'uso della toolchain Java e degli strumenti di lingua di terze parti.

  • E 'utilizzato da compilatori Java in nomi di classe "interni" per le classi interne e nidificate.
  • Viene utilizzato dai compilatori Java nei nomi degli attributi sintetici.
  • Potrebbe essere utilizzato da generatori di codice di terze parti (ad es.processori di annotazione) per vari scopi.
  • Potrebbe essere utilizzato da altre lingue che hanno come target la piattaforma JVM e che potrebbe dover coesistere con il codice.

Probabilmente non avrete problemi tecnici con un semplice nome di classe $ al momento (almeno rispetto alla toolchain Java standard). Ma c'è sempre la possibilità che questo cambierà in futuro:

  • Hanno riservato il diritto di cambiare questo.
  • Esiste un precedente per fare questo nell'esempio _.

Se davvero, davvero bisogno di un nome di classe di un carattere, sarebbe meglio andare sul sicuro e usare F o Z o qualcos'altro che non è riservata.

Ma per essere onesti, penso che staresti meglio cercando di implementare (o semplicemente usare) un vero linguaggio funzionale piuttosto che provare a suonare un "sistema" di programmazione funzionale in Java. O forse, passa a Java 8 in anticipo rispetto alla sua versione ufficiale. 'Per quanto mi riguarda, rifiuta di leggere/gestire una base di codice Java simile a jQuery.


non intendo creare un lib funzionale per Java, vogliono solo creare un lib per mantenere alcuni servizi comuni che ho usato. Ancora una volta, sono un sostenitore del minimalismo e sento di succhiare cose come Apache Commons. Le cose funzionali sono state aggiunte per aiutarmi a manipolare più facilmente le raccolte.

Se è il tuo codice, puoi fare quello che ti piace. Prendi le tue decisioni. Agisci sulle tue opinioni. Sii un "risk taker" ... :-). (Il nostro consiglio su $, eccetera ... è discutibile.)

Ma se si sta scrivendo il codice per un cliente o datore di lavoro, o con l'intenzione di creare una (valida) prodotto open source, quindi è necessario prendere conto dell'opinione di altre persone. Ad esempio, il tuo capo ha bisogno di avere un'opinione informata su quanto sarà mantenibile il tuo codice se trovi un lavoro meglio retribuito da qualche altra parte. In generale, il prossimo sarà in grado di capirlo, manterrà il tuo codice, fresco, ecc ... o sarà consegnato alla pattumiera?

+1

Seriamente non mi piace il segno '$', ecco perché ho scelto' _', che mi dà una sensazione di "default"; Parole laterali: originariamente non intendo creare una lib funzionale per Java, voglio solo creare una lib per mantenere alcune utilità comuni che ho usato. Ancora una volta, sono un sostenitore del minimalismo e sento di succhiare cose come Apache Commons. Le cose funzionali sono state aggiunte per aiutarmi a manipolare più facilmente le raccolte. –

+2

@ stephen-c, che è stato menzionato nella domanda originale ... 18 mesi fa –

3

Huh, hai ragione, utilizzando un nome di classe funziona con uno $. Eclipse si lamenta che è contro la convenzione, ma, se sei sicuro, puoi farlo.

Il problema (convenzionalmente) con l'utilizzo di un $ è che il $ viene utilizzato nella gerarchia delle classi per indicare le classi annidate .... per esempio, il file contenente A.java:

class A { 
    class SubA { 
    } 
} 

otterrebbe compilato per due file:

  1. A.class
  2. a $ SubA.class

Ed è per questo, anche se $ funziona, è mal consigliato, perché l'analisi dei vasi può essere più difficile ... e si corre il rischio di collisione due classi e causando altri problemi

EDIT, ho appena fatto un test con i seguenti due file Java (nel pacchetto di default)

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()); 
    } 
} 

E il codice non viene compilato .....

due problemi, tipo a $ SubA è già definita, e ca non fa riferimento a una classe nidificata A $ SubA dal suo nome binario.

+1

Questo non è il mio caso. Come ho detto, quello che intendo fare è usare un singolo '$' come nome della classe. –

+2

Questo non sarà un problema nel caso illustrato (c'è solo una classe che si chiama "$") –

+0

@rolfl Questo è fuori tema. La biblioteca è uno sforzo per creare qualcosa di nuovo, ma potrebbe sembrare strano per i ragazzi che sono abituati a quei trenta CharleyLongVariableOrMethodNames nel mondo JEE tradizionale. La versione uno è già inserita nell'utilizzo del progetto aziendale e alcuni dei miei altri progetti del sistema operativo come (https://github.com/greenlaw110/java-storage). Non è una brutta esperienza onestamente. Comunque penso che sia una questione di gusti e se pensi ci siano grossi problemi, ti preghiamo di creare un problema in github e io seguirò laggiù –

2

Sì, per essere pedante nel rispondere alla tua domanda c'è un rischio. Come hanno già detto altre persone, viola le convenzioni sui nomi java. Quindi il rischio è che con le versioni future del JDK ciò possa causare problemi. Ma oltre a questo, e alcuni problemi se si tenta di utilizzare classi nidificate si dovrebbe andare bene.

1

Si rischia di prendere a calci un culo se qualcun altro ha mai bisogno di leggere o mantenere il proprio codice.

2

penso che si sta cercando di evitare nomi brutti come Util.andThen. Prendi in considerazione l'utilizzo di static imports. Ciò ti consente di importare tutti i metodi nell'intestazione import static org.ogsl.Util.*, quindi puoi semplicemente utilizzare l'utente andThen senza alcun prefisso.

+0

Mentre questo link può rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il link per riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia. –

+0

@HarshalPatil: Questo * fa * sembra includere qui gli elementi essenziali: usa le importazioni statiche come 'example', più documenti qui. –

Problemi correlati