web-dev-qa-db-fra.com

Java Getters and Setters

Existe-t-il un meilleur moyen standard de créer des getters et setters en Java?

Il est assez verbeux de devoir définir explicitement des getters et setters pour chaque variable. Existe-t-il une meilleure approche des annotations standard?

Le printemps a-t-il quelque chose comme ça?

Même C # a des propriétés.

56
Verhogen

Je ne sais pas si vous le considéreriez comme "standard", mais Project Lombok résout ce problème. Ils utilisent des annotations pour remplacer une grande partie de la verbosité de Java.

Certaines personnes envisagent des langues alternatives Java frères et sœurs, tels que Groovy ou Scala. Je crains que cela ne prenne quelques années - voire pas du tout) avant que le JSR ne trouve une manière "standardisée" de "corriger" ceci dans Java propre.

66
Carl Smotricz

Eclipse a une option de menu contextuel qui les générera automatiquement pour vous, comme je suis sûr que de nombreux autres IDE le font.

19
Ascalonian

J'ai créé des annotations qui ne sont pas spécifiques à Eclipse.

Voir http://code.google.com/p/javadude/wiki/Annotations

Par exemple:

package sample;

import com.javadude.annotation.Bean;
import com.javadude.annotation.Property;
import com.javadude.annotation.PropertyKind;

@Bean(properties={
    @Property(name="name"),
    @Property(name="phone", bound=true),
    @Property(name="friend", type=Person.class, kind=PropertyKind.LIST)
}) 
public class Person extends PersonGen {
}

Mes annotations génèrent une superclasse; Je pense que Lombok modifie la classe en cours de compilation (qui n'est officiellement pas prise en charge par Sun et peut se casser - je peux me tromper sur la façon dont cela fonctionne, mais d'après ce que j'ai vu, ils doivent le faire)

Prendre plaisir! - Scott

6
Scott Stanchfield

Il y a aussi le projet Spring Roo avec son annotation @RooJavaBean. Il a également @RooToString et @RooHashCodeEquals ou quelque chose comme ça. Il génère en arrière-plan un fichier AspectJ avec les méthodes appropriées.

3

La plupart des IDE fournissent un raccourci pour générer le code (par exemple Eclipse: clic droit -> Source -> Générer des Getters & Setters ) , bien que je réalise que ce n'est probablement pas la réponse que vous cherchez.

Certains frameworks IOC vous permettent d'annoter des propriétés afin qu'elles puissent être utilisées dans le contexte du framework, par exemple Tapestry IOC, et le dernier Spring, je pense (mais cette utilisation est limitée à l'utilisation par le cadre)

3
Joel

Voici un article intéressant sur le sujet: http://cafe.elharo.com/Java/why-Java-doesnt-need-properties-it-already-has-them/

Je pense que les propriétés sont un raccourci mais c'est plus une petite fonctionnalité qu'une fonctionnalité vraiment importante

3
Jerome Cance

Je suis d'accord que les getter/setters sont bavards. Project Lombok a une bonne réponse comme suggéré par d'autres. Sinon, vous pourriez utiliser la capacité de votre IDE pour les générer.

3
fastcodejava

Comme alternative possible, avez-vous essayé Scala ? Il se compile en Java bytecode, et a beaucoup de raccourcis intéressants qui peuvent vous faciliter la vie en tant que programmeur Java Java).

Propriétés par exemple:

case class Person(var name:String, 
                  var age:Int);
val p = Person("John", 4)
p.name
p.name = "Charlie"
p.name

Et la sortie:

defined class Person
p: Person = Person(John,4)
res7: String = John
res8: String = Charlie
2
Martin Wickman

Avec Netbeans, commencez simplement à taper get ou set où le getter/setter doit être remplacé et appelez auto complete (Ctrl + Espace), cela vous donnera la possibilité de générer le getter ou le setter. Cela vous donnera également la possibilité de générer un constructeur.

2
monksy

Il n'y a pas de meilleure façon de faire partie du langage - rien de tel qu'un mot-clé "propriété".

Une autre alternative, comme d'autres l'ont mentionné, est d'utiliser votre IDE pour les générer. Une autre, si vous avez beaucoup d'objets qui en ont besoin, est d'écrire votre propre outil de génération de code qui prend une classe de base et produit un wrapper avec des getters et des setters.

Vous pouvez également simplement exposer les variables en tant que membres publics. Cependant, en cours de route, cela reviendra probablement vous blesser lorsque vous déciderez d'ajouter une logique de validation.

Cependant, une dernière pensée: à moins que vos classes ne soient utilisées simplement pour transférer des données, elles ne devraient probablement pas exposer leur état interne. IMO, les classes de "comportement" avec des getters et des setters sont une odeur de code.

2
kdgregory

Essayez quelque chose comme ceci:

@Getter @Setter private int age = 10;

Plus d'infos ci-dessous:

https://projectlombok.org/features/GetterSetter

2
Akash Yellappa

Ouais, tu n'as pas de chance. Groovy les génère pour vous, mais pas de dés en Java standard. Si vous utilisez Eclipse, vous pouvez les générer assez facilement , ainsi que générer des fonctions hashCode () et equals ().

1
TheBigS

C'est le travail du IDE pour générer du code verbeux répétitif en tant que getters/setters

0
user225486

Utilisez votre IDE pour le générer pour vous et essayez de minimiser la quantité de getters/setters que vous avez - vous apprécierez probablement l'avantage supplémentaire de l'immuabilité.

J'aime la syntaxe C # pour les propriétés, je pense que c'est joli et propre et assez propre.

0
Ravi Wallau

Eh bien, une option est de ne pas avoir si peur des champs publics. Pour les classes simples dont vous savez qu'elles ne feront jamais de validation ou de travail supplémentaire sous le capot sur get et set, les champs publics nécessitent moins de passe-partout, sont syntaxiquement plus agréables et sont plus efficaces.

0
dsimcha

Si vous utilisez emacs, il peut être possible de définir une macro emacs qui le fait pour vous. Des gourous emacs là-bas? :)

0
Larry Watanabe