2009-10-07 3 views
0

Dans le cas suivant snippet ASur la longévité des cordes statiques vs chaînes apparemment locales en Java

private static final String SQL = "SELECT * FROM TABLE WHERE ID = ?"; 

et snippet B

public List<MyObject> getData(final Long id){ 
    return (List<MyObject>)template.query("SELECT * FROM TABLE WHERE ID = ?",id); 
} 

et snippet C

public List<MyObject> getData(final Long id){ 
    return (List<MyObject>)template.query(SQL,id); 
} 

sont B et C effectivement la même chose? Est-ce que ma chaîne dans B est gc'd (jeune génération?) Parce qu'elle a une portée locale?

+1

c'est le genre de micro-optimisation dont vous ne devriez vraiment pas vous soucier ... – Kip

+0

En effet, mais je vois ce modèle "psfs" tout le temps, je me demandais s'il y avait un gain d'efficacité à déclarer la requête comme un "psfs" ou inline - devinez pas, applaudissements. –

Répondre

1

Non. Ni B ni C ne créent un String. Le String sera créé lorsque le code est chargé (s'il n'existe pas déjà en tant que String). Il sera collecté avec le reste du code (sauf s'il y a une autre référence à la même instance String).

2

Les constantes de chaîne sont toujours internées. Chaque fois que vous appelez l'extrait B, il utilise le même objet chaîne. Fondamentalement, c'est équivalent à l'extrait A + C.

En effet, deux constantes de chaîne qui ont la même séquence de caractères utilisera les références à la même chaîne aussi:

String x = "a" + "b"; 
String y = "ab"; 

System.out.println(x == y); // true 
+0

Donc, en d'autres termes, si j'ai utilisé B ma chaîne locale n'est pas internée et serait garbage collectée mais en C la chaîne SQL sera internée et ne sera pas GC'd –

+2

non, vous n'avez pas lu la réponse correctement. tous vos extraits produisent une chaîne internée. – james

1

Les deux B et C utilisent la même valeur de chaîne, puisque toutes les chaînes sont essentiellement « mises en cache » par la JVM. Ils existent en mémoire aussi longtemps qu'ils le doivent.

L'utilisation de B ou C dépend de la lisibilité du code (et de sa maintenabilité). L'approche B offre l'avantage que la chaîne de requête SQL est immédiatement adjacente au code qui utilise ses résultats, donc il ne devrait pas être question de savoir quelle est la requête au moment où elle est utilisée.

L'approche C est avantageuse si vous utilisez la même chaîne de requête SQL à plusieurs endroits, ce qui vous permet de définir la chaîne une seule fois pour toute la classe (ou le paquet, pair). Si vous devez le changer partout où il est utilisé, il vous suffit de changer cette définition.

Questions connexes