Domanda

Diciamo che ho una classe come questa:

class ApplicationDefs{
public static final String configOption1 = "some option";
public static final String configOption2 = "some other option";
public static final String configOption3 = "yet another option";
}

Molte delle altre classi nella mia richiesta utilizzano queste opzioni. Ora, voglio cambiare una delle opzioni da solo e distribuire solo la classe compilata. Ma se questi campi sono allineati in-nelle classi di consumo questo diventa giusto impossibile?

C'è un opzione per disabilitare l'in-rivestimento delle costanti di tempo di compilazione?

È stato utile?

Soluzione

È possibile utilizzare String.Intern () per ottenere l'effetto desiderato, ma dovrebbe lasciare un commento, il codice, perché molte persone non sanno di questo. cioè.

public static final String configOption1 = "some option".intern();

Questo consentirà di evitare il tempo in linea di compilazione. Dal momento che si riferisce al Esigono la stessa stringa che il compilatore inserirà nel perm, non si sta creando qualcosa di extra.

In alternativa si può sempre fare

public static final String configOption1 = "some option".toString();

tuttavia questo non utilizzerà la stringa intern'd compilato, verrà creato uno nuovo sul vecchio gen. Non è un grosso problema enorme, e potrebbe essere più facile da leggere. Ad ogni modo, dal momento che questo è un po 'strano che si dovrebbero commentare il codice per informare coloro mantenimento cosa si sta facendo.

Modifica Trovato un altro SO link che dà riferimenti alla JLS, per ulteriori informazioni su questo. Quando utilizzare intern () sulla stringa letterali

Altri suggerimenti

No, è parte del JLS, temo. Questo è toccato, per breve tempo, in Java Puzzlers ma non ho la mia copia a portata di mano.

Credo che si potrebbe considerare di avere queste costanti definite in un file di proprietà, e hanno la classe che li carica periodicamente.

Riferimento: http: //java.sun. com / docs / libri / JLS / third_edition / html / expressions.html # 5313

No. Si potrebbe sostituirli con una chiamata di metodo statico, anche se, come:

class ApplicationDefs {

    public static String configOption1() { return "some option"; }

}

Certo, non è bello, ma sarebbe soddisfare la vostra esigenza. :)

In realtà, se si rimuovere la parola chiave final le costanti di smettere di essere costanti in fase di compilazione e quindi la configurazione di funzionerà , come si desidera.

Tuttavia, è fortemente suggerito che se questo è davvero una sorta di configurazione che si sta tentando di fare, si dovrebbe passare a un modo più gestibile rispetto costanti in alcuni file di classe.

È possibile inibire la messa in linea facendo il vostro costante non compilare costanti di tempo ...

Per esempio, null non è una costante di tempo di compilazione. Qualsiasi espressione contenente un non-compilazione costante di tempo non è una fase di compilazione costante, anche se può fare javac costante piegatura all'interno unità di compilazione.

public static final String configOption1 = null!=null?"": "some option";

Non c'è niente qui che dice che questi valori devono essere inline. Si sono appena dichiarando alcuni public, membri static. Tali altre classi utilizzano i valori di questi componenti. No inlining viene chiesto. Anche la parola final

Ma per ragioni prestazioni , alcuni JVM possono linea di questi valori in quelle altre classi. Si tratta di un'ottimizzazione. Nessuna ottimizzazione dovrebbe cambiare il comportamento di un programma. Quindi, se si modifica la definizione di questi membri, la JVM dovrebbe non-inline i valori precedenti.

Questo è il motivo per cui non v'è alcun modo per trasformare inlining off. O la JVM non in linea e non c'è nessun problema o se è inline, la JVM garantisce la non-inline.

Non sono sicuro di ciò che accade quando si importa staticamente questa classe. Credo (non sono sicuro) l'inlining viene eseguita e può causare il disturbo si parla. Se questo è il caso, si potrebbe in pratica elimina l'importazione statica e sei ok.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top