Question

Ainsi, j’ai volontairement gardé moi-même un Java n00b jusqu’à récemment, et ma première véritable exposition a provoqué un choc mineur: Java n’a pas de propriétés de style C #!

Ok, je peux vivre avec ça. Cependant, je peux aussi jurer que j'ai vu le code de lecture / définition de la propriété en Java dans une base de code, mais je ne me souviens plus où. Comment cela a-t-il été réalisé? Existe-t-il une extension linguistique pour cela? Est-ce lié à NetBeans ou à quelque chose d'autre?

Était-ce utile?

La solution

Il existe un "standard". modèle pour les accesseurs et les installateurs en Java, appelé Propriétés du bean . Fondamentalement, toute méthode commençant par get , ne prenant aucun argument et ne retournant une valeur, est un getter de propriété pour une propriété nommée en tant que reste du nom de la méthode (avec une lettre de début en minuscule). De même, set crée un opérateur de définition d'une méthode void avec un seul argument.

Par exemple:

// Getter for "awesomeString"
public String getAwesomeString() {
  return awesomeString;
}

// Setter for "awesomeString"
public void setAwesomeString( String awesomeString ) {
  this.awesomeString = awesomeString;
}

La plupart des IDE Java génèrent ces méthodes si vous leur demandez (dans Eclipse, il suffit de déplacer le curseur sur un champ et d'appuyer sur ctrl-1, puis de sélectionner l'option dans la liste).

Pour des raisons de lisibilité, vous pouvez réellement utiliser , c'est et a à la place de get pour les propriétés de type booléen, comme dans:

public boolean isAwesome();

public boolean hasAwesomeStuff();

Autres conseils

Je suis surpris que personne n'ait mentionné le projet lombok

.

Oui, il n’existe actuellement aucune propriété en java. Il manque également d'autres fonctionnalités.
Mais heureusement, nous avons le projet Lombok qui tente d'améliorer la situation. Il devient également de plus en plus populaire chaque jour.

Donc, si vous utilisez lombok:

@Getter @Setter int awesomeInteger = 5;

Ce code va également générer getAwesomeInteger et setAwesomeInteger . Il est donc assez similaire aux propriétés implémentées automatiquement par C # .

Vous pouvez obtenir plus d'informations sur les getters et les passeurs de lombok ici .
Vous devez absolument vérifier les autres fonctionnalités . Mes favoris sont:

Lombok est bien intégré aux IDE. Il va donc montrer les méthodes générées comme si elles existaient (suggestions, contenu de la classe, aller à la déclaration et au refactoring).
Le seul problème avec Lombok est que d'autres programmeurs pourraient ne pas le savoir. Vous pouvez toujours supprimer des codes , mais il s’agit plutôt d’une solution de contournement que d’une solution.

" Support des propriétés Java " a été proposé pour Java 7, mais ne l’a pas été dans le langage.

Voir http://tech.puredanger.com/java7#property pour plus de liens. et info, si vous êtes intéressé.

La convention de haricot est d'écrire du code comme ceci:

private int foo;
public int getFoo() {
    return foo;
}
public void setFoo(int newFoo) {
    foo = newFoo;
}

Dans certaines des autres langues de la machine virtuelle, Groovy, par exemple, vous obtenez des propriétés remplaçables similaires à C #, par exemple,

.
int foo

auquel on accède avec un simple .foo et exploite les implémentations getFoo et setFoo par défaut que vous pouvez remplacer si nécessaire.

public class Animal {

    @Getter @Setter private String name;
    @Getter @Setter private String gender;
    @Getter @Setter private String species;
}

Cela ressemble à des propriétés C #. C'est http://projectlombok.org/

Vous n’avez peut-être pas besoin de & get; get " et " set " préfixes, pour que cela ressemble plus à des propriétés, vous pouvez le faire comme ceci:

public class Person {
    private String firstName = "";
    private Integer age = 0;

    public String firstName() { return firstName; } // getter
    public void firstName(String val) { firstName = val; } // setter

    public Integer age() { return age; } // getter
    public void age(Integer val) { age = val; } //setter

    public static void main(String[] args) {
        Person p = new Person();

        //set
        p.firstName("Lemuel");
        p.age(40);

        //get
        System.out.println(String.format("I'm %s, %d yearsold",
            p.firstName(),
            p.age());
    }
}

La plupart des IDE pour Java généreront automatiquement le code de lecture et de définition pour vous, si vous le souhaitez. Il existe un certain nombre de conventions différentes, et un IDE comme Eclipse vous permettra de choisir celle que vous voulez utiliser et même de définir les vôtres.

Eclipse inclut même un refactoring automatisé qui vous permettra d’envelopper une propriété dans un getter et un setter et modifiera tout le code qui accède directement à la propriété pour lui faire utiliser le getter et / ou le setter.

Bien entendu, Eclipse ne peut modifier que le code qu’elle connaît, toutes les dépendances externes que vous possédez pourraient être rompues par un tel refactoring.

Extrait du livre de Jeffrey Richter sur le CLR via C # : (je pense que ce pourrait être la raison pour laquelle les propriétés ne sont toujours pas ajoutées à JAVA)

  • Une méthode de propriété peut générer une exception. l'accès aux champs ne déclenche jamais d'exception.
  • Une propriété ne peut pas être transmise en tant que paramètre out ou ref à une méthode; un champ peut.
  • L'exécution d'une méthode de propriété peut être longue; l'accès au champ se termine toujours immédiatement. Une raison courante d’utiliser des propriétés est d’effectuer la synchronisation des threads, qui peut arrêter le fil pour toujours, et par conséquent, une propriété ne doit pas être utilisé si la synchronisation des threads est requise. Dans cette situation, une méthode est préférable. De plus, si votre classe est accessible à distance (par exemple, votre classe est dérivée de System.MarshalByRefObject ), l'appel de la méthode property sera très lent et par conséquent, une méthode est préférable à une propriété. A mon avis, les classes dérivées de MarshalByRefObject ne doit jamais utiliser de propriétés.
  • Si elle est appelée plusieurs fois dans une ligne, une méthode de propriété peut renvoyer une valeur différente chaque temps; un champ renvoie la même valeur à chaque fois. La classe System.DateTime est en lecture seule. Propriété Now qui renvoie la date et l'heure actuelles. Chaque fois que vous interrogez ce propriété, il retournera une valeur différente. C’est une erreur et Microsoft souhaite que ils pourraient réparer la classe en faisant de Now une méthode plutôt qu'une propriété. Environnement La propriété TickCount est un autre exemple de cette erreur.
  • Une méthode des propriétés peut provoquer des effets secondaires observables. l'accès au champ ne le fait jamais. En d'autre En d'autres termes, un utilisateur d'un type devrait pouvoir définir diverses propriétés définies par un type dans n'importe quel ordre qu'il choisit sans remarquer aucun comportement différent dans le type.
  • Une méthode de propriété peut nécessiter de la mémoire supplémentaire ou renvoyer une référence à quelque chose fait pas partie de l’état de l’objet, donc la modification de l’objet retourné n’a aucune effet sur l'objet d'origine; l'interrogation d'un champ renvoie toujours une référence à un objet qui est garanti pour faire partie de l'état de l'objet d'origine. Travailler avec une propriété qui renvoie une copie peut être très déroutant pour les développeurs, et cette caractéristique est souvent non documenté.

Mon expérience en Java n’est pas très bonne non plus, donc tout le monde n’est pas libre de me corriger. Mais autant que je sache, la convention générale est d'écrire deux méthodes comme suit:

public string getMyString() {
    // return it here
}

public void setMyString(string myString) {
    // set it here
}

Si vous utilisez eclipse, il est capable de générer automatiquement la méthode d'accesseur et de getter pour les attributs internes. Il peut s'agir d'un outil utile et rapide.

Je viens de publier des annotations Java 5/6 et un processeur d'annotation pour vous aider.

Découvrez http://code.google.com/p/javadude/wiki / Annotations

La documentation est un peu légère en ce moment, mais la quickref devrait faire passer l'idée.

Fondamentalement, il génère une super-classe avec les getters / setters (et de nombreuses autres options de génération de code).

Un exemple de classe peut ressembler à

@Bean(properties = {
    @Property(name="name", bound=true),
    @Property(name="age,type=int.class)
})
public class Person extends PersonGen {
}

De nombreux autres exemples sont disponibles et le code généré ne contient aucune dépendance d'exécution.

Envoyez-moi un email si vous l'essayez et le trouvez utile! - Scott

Il n'y a pas de mot-clé de propriété en java (comme vous pourriez le trouver en C #), la méthode la plus proche pour avoir 1 mot getter / setter consiste à faire comme en C ++:

public class MyClass
{
    private int aMyAttribute;
    public MyClass()
    {
        this.aMyAttribute = 0;
    }
    public void mMyAttribute(int pMyAttributeParameter)
    {
        this.aMyAttribute = pMyAttributeParameter;
    }
    public int mMyAttribute()
    {
        return this.aMyAttribute;
    }
}
//usage :
int vIndex = 1;
MyClass vClass = new MyClass();
vClass.mMyAttribute(vIndex);
vIndex = 0;
vIndex = vClass.mMyAttribute();
// vIndex == 1

Comme mentionné précédemment pour eclipse, l'environnement de développement intégré (IDE) peut souvent créer automatiquement des méthodes d'accès.

Vous pouvez également le faire en utilisant NetBeans.

Pour créer des méthodes d'accesseur pour votre classe, ouvrez un fichier de classe, puis cliquez avec le bouton droit de la souris dans l'éditeur de code source et choisissez la commande de menu Refactoring, Encapsuler les champs. Une boîte de dialogue s'ouvre. Cliquez sur Sélectionner tout, puis sur Refactor. Voil & # 224;,

Bonne chance,

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top