Java 代码不写getter, setter, 转化为 public, 有什么弊端?
PHP中文网
PHP中文网 2017-04-18 10:35:44
0
9
1369
PHP中文网
PHP中文网

认证0级讲师

répondre à tous(9)
小葫芦

Eh bien, il y a en fait beaucoup de choses que vous pouvez faire grâce aux méthodes, surtout lorsqu'elles sont combinées avec des idées OO - Le type est une information importante.

De plus, il s'agit d'un standard. Java Bean n'est que cela. Le "fonctionnement normal" de nombreux frameworks et bibliothèques tierces (le plus connu est Spring) repose également sur. ce . Vous pouvez rechercher des articles liés aux « Beans Java dans Java Empire ».

Fortement opposé aux réponses telles que Logique d'écriture de Setter. Un tel code est extrêmement trompeur. Les personnes expérimentées savent que vous ne pouvez pas écrire de logique dans la couche "bean" (correspondant généralement à la couche Modèle), mais au moins dans la couche Service (selon l'architecture commune à trois couches). Par conséquent, le Setter dans ce cas n’est pas si important. Pour résumer, les réponses concernant l'écriture de la logique dans Setter sont toutes incorrectes.

Enfin, permettez-moi de commenter la personne qui a dit L'existence est raisonnable J'espère qu'elle peut comprendre ce que "L'existence est raisonnable" exactement.


Je voudrais répondre formellement aux personnes qui m'ont critiqué——Il y a des gens qui parlent de logique dans Setter, et il y a aussi des gens qui s'appuient sur « théories fallacieuses » Une personne qui vient persuader les autres.

Racontez-moi une histoire, quand je suis arrivé pour la première fois dans la communauté il y a un an. J'ai vu une fois un panneau écrit par un maître avec un score relativement élevé Rubbish SF ! , j'ai remarqué son record de réputation (à cette époque, le record de réputation était quelque peu similaire au record de commit de GitHub, mais il ne durait pas plus d'un an), presque tous les problèmes avaient été rejetés , évidemment ——C'est malveillant.

Étant dans la communauté depuis plus d'un an, j'ai parfois rencontré des situations comme celle-ci. Mais les moyens ne sont pas si mauvais. De même, j'avoue que je suis toujours très bon dans ce domaine. Si je ne suis pas sûr de certains problèmes, je peux tromper les autres. Si on me marche dessus, on me marche dessus !

Maintenant, cette situation m'est intolérable - si je me trompe, je me trompe, Je dois encore induire les autres en erreur. Il serait dommage que d'autres personnes soient éliminées parce qu'elles ont échoué à une question aussi fondamentale lors de l'entretien  !

Enfin, je veux tout dire :

  1. Je ne quitterai pas la communauté simplement parce que je n'ai pas été aimé, même si cela a été malicieusement détesté. Parce que je dois répondre à plus de questions pour éviter que davantage de novices ne soient induits en erreur par des « terribles débutants ». De même, afin de maintenir la qualité de la communauté, je ne lâcherai jamais les réponses extrêmement trompeuses.

  2. Si vous ne me croyez pas, dites à l'intervieweur lors de l'entretien que vous écrivez souvent de la logique dans le Setter de Java Bean !

  3. J'ai scanné attentivement toutes les réponses tout à l'heure. Heureusement, il y a des utilisateurs comme @kevinz ici, j'ai voté pour lui pour empêcher les "terribles débutants" de le rabaisser.

  4. +1 point pour répondre, et seulement 1 point pour suivre la tendance. Être piétiné équivaut à 2 points. Et comme il y a de plus en plus de réponses comme celle-ci, la qualité de la communauté deviendra de pire en pire, même si vous avez une réputation de 1W, si vous le dites fièrement lorsque vous discutez ou communiquez, les autres se contenteront de ricaner : Que la qualité de la communauté n'est pas élevée, ils suivent tous simplement la tendance.

刘奇

Chaque langue a une philosophie différente. Java est entièrement orienté objet et favorise une grande flexibilité et évolutivité du code lors du codage . Des langages comme Go prônent la simplicité ultime du code, il vous suffit donc de définir struct comme suit.

type S struct {
    A string
    B int
}

Mais dans Java vous devez toujours respecter la spécification et définir la méthode javabean pour get/set, car vous vous conformez à la spécification pour profiter des avantages que la spécification vous apporte Par exemple, lorsque vous accédez. une bibliothèque tierce, lorsqu'ils utilisent reflect pour faire fonctionner javabean, la plupart d'entre eux utilisent la méthode get/set. Si votre javabean n'a pas de méthode get/set pour le moment, alors vous ne pouvez évidemment pas utiliser cette bibliothèque.


Basé sur expérience personnelle, la simplicité du code est plus importante que la flexibilité et l'évolutivité du code. Par conséquent, des boîtes à outils comme java apparaissent également dans lombok, ce qui peut très bien simplifier le code.

伊谢尔伦

Les personnes ci-dessus en ont dit beaucoup, mais elles ont oublié un point Les méthodes sont polymorphes, mais les attributs ne sont pas polymorphesComment comprenez-vous cela ? Par exemple, Person est la classe parent, Man est la sous-classe, la classe parent et la sous-classe ont l'attribut Name (bien que cela soit très rare) et les noms de la classe parent et de la sous-classe sont tous deux publics. Veuillez consulter le code suivant :

Person p = new Man();
p.name = "person";
Print(p.name);
Print(p.getName());

La réponse affichera
personne
null

迷茫

C'est une bonne question ! Pourquoi ne rendons-nous pas simplement ce champ privé public au lieu d'utiliser des setters et getters fastidieux ? Il y a plusieurs raisons :

Ne faites jamais confiance aux commentaires des clients

Supposons cette classe :

class Bicycle {
    public int speed;
    
    // ...
}

public class BicycleTest{
    public static void main(String[] args){
        Bicycle b = new Bicycle();
        b.speed = 300000; //什么?自行车这么快?不科学啊?自行车车速不超过120吧。
        // 可是作为程序员的我怎么办呢?只能在文档里告诉用这个类的人:超过120罚款?
        // WTF!写这个类的程序员该死。
        b.speed = -30; // 这个?负的速度,高中物理?我勒个去。
    }
}

Est-ce que ce serait mieux si nous le changions par ceci :

class Bicycle {
    private int speed;
    
    public int setSpeed(int speed) {
        if(speed > 120){
            this.speed = 120;
        } else if(speed < 0){
            this.speed = 0;
        } else{
            this.speed = speed;
        }
    }
    public int getSpeed() {
        return speed;
    }
}

public class BicycleTest{
    public static void main(String[] args){
        Bicycle b = new Bicycle();
        b.speed = 300000; 
        System.out.println(b.getSpeed()); // 显示120
    }
}

Facile à modifier

Supposons que la vitesse doive maintenant être comprise entre 0 et 40. Sans getters et setters, tout le code devrait être réécrit et il serait impossible de le terminer en moins d'une heure. Avec ce setter, c'est simple, il suffit de changer la logique du setter. S'il ne se termine pas en 1 minute, le programmeur peut le démarrer.

public int setSpeed(int speed) {
        if(speed > 40){
            this.speed = 40;
        } else if(speed < 0){
            this.speed = 0;
        } else{
            this.speed = speed;
        }
    }
黄舟

Je crois comprendre que les avantages et les inconvénients sont relatifs. Pour un "petit programme", il n'y a pas d'inconvénients, car vous et les autres responsables pouvez clairement voir et contrôler les changements dans les valeurs des paramètres à ce stade, car vous le pouvez. contrôler entièrement chaque recoin du programme, public et même "les avantages l'emportent sur les inconvénients", car sans setter&getter, beaucoup de code est réduit. Mais lorsque le programme est « grand » à une certaine échelle, devons-nous considérer la maintenabilité du programme ? Par exemple, si a.money et a.getMoney() ajoutent soudainement un facteur a.action à 影响money un jour, que devons-nous faire ? S'assurer que chaque appelant de money peut connaître les règles d'influence des facteurs, évidemment 直接a.money就不那么可靠. Du point de vue de l'écriture de programmes, vous devriez écrire plus de méthodes. C'est ce que mon professeur de programmation informatique à l'université m'a appris. Les données sont ennuyeuses, mais les méthodes peuvent vous donner une idée visuelle de ce que fait le programme. D'un point de vue orienté objet, les objets doivent fournir des méthodes pour faire fonctionner les objets, ce sont donc toujours des méthodes, et setter和getter incarne cette idée. En termes de fonctionnalités Java, setter和getter incarne l'idée des fonctionnalités d'encapsulation. Dans l'exemple ci-dessus, lorsqu'un autre utilisateur d'argent doit appeler money, l'appelant n'a pas besoin de savoir qu'il existe un facteur d'action, il. il suffit de getMoney()obtenir simplement le money correct. Les variables sont privées et fournissent des méthodes publiques pour faire fonctionner les variables. À l’heure actuelle, les avantages l’emportent sur les inconvénients. Ceux qui ont peu de talent et peu de connaissances, parlent de la même famille et acceptent les critiques et les corrections s'ils comprennent quelque chose d'inapproprié.


De plus, concernant le problème de logique au sein de setter&getter, je pense qu'il s'agit d'une question de "est-ce que ça devrait être", plutôt que d'une question de "est-ce possible ? Pour ce dernier, je dirais oui, pourquoi pas ! Quant au premier, vous devez peser le pour et le contre. Lorsque la logique de votre programme et le contrôle des risques sont bons, il vous sera plus pratique d'écrire ! Ces excellents frameworks ne sont pas écrits de cette manière, et ils doivent être basés sur les avantages et les inconvénients (extension, etc.). Il est normal de mettre la logique dans la couche de traitement logique.

洪涛

Tout d’abord, la traduction de méthode est méthode.


Alors laissez-moi comprendre votre confusion

Mais faut-il vraiment penser autant à l'avenir ?

En fait, la principale raison pour laquelle vous ne faites pas cela est que c'est très gênant.

Mais en fait, vous aurez ces champs (champs, attributs) qui doivent utiliser des getter setters, comme les champs en lecture seule, donc 1⃣️, pour la cohérence du code global, il est préférable d'utiliser tous les getters et setters .
2⃣️, utiliser l’aide d’ide ne demande en fait pas beaucoup d’efforts.
3⃣️, c'est fondamentalement une chose normative, il n'y a pas besoin de se demander si c'est nécessaire de faire cela.
4⃣️, dans certains cas, les getters et setters ne sont en effet pas nécessaires. Si vous êtes sûr que les données ici sont très simples, rendez-les simplement publiques.


À propos d'une autre question

Si un champ privé fournit des getters et des setters, alors il est considéré comme public, ce qui est incohérent et public

doit être utilisé.

Quel est le but

Tout d'abord, un champ privé ne peut avoir qu'un getter et un setter, ce qui n'est naturellement pas considéré comme public. S’il existe à la fois des setters et des getters, ce n’est pas aussi simple qu’on le pense. Parce que le getter setter que vous avez écrit vous-même n'a aucune logique de traitement, mais vous considérez ceci

private String name;

public void setName(String name) {
    this.name = name.trim();
}

public String getName() {
    return name;
}

Si vous avez les mêmes besoins que cet exemple, vous devez supprimer les espaces supplémentaires lors de l'enregistrement du nom. (Au fait, je ne peux pas garantir que la syntaxe du code ci-dessus est correcte. Je n'ai pas écrit Java depuis longtemps.


Concernant la question de savoir si les appels en champ ouvert sont plus confortables, en fait, les champs ouverts de python que vous avez mentionnés ne sont pas des champs ouverts, n'est-ce pas ? Le champ de stockage réel est _name, et le getter et le setter sont name. Ceci n'est différent que par la syntaxe de Java, mais l'essence est la même.

Je vais mettre deux autres morceaux de code pour montrer les avantages des getters et des setters.

private int userId;

public User getUser();

public void setUser(user);

Autre exemple

private Map data;

public User getUser();

public int getStatus();
小葫芦
class GoodDog {
    private int size;
    
    public int getSize() {
       return size;
    }

    public void setSize(int s){
       size = s;
    }
}

Il y a ici un problème d’encapsulation et de contrôle. Supposons que vous accédiez directement à la propriété goodDog.size ; du coup, un jour, vous devrez peut-être filtrer quelque chose pour chaque taille, ou pour une certaine taille, que devez-vous faire ? Ensuite, vous devez ajouter des mécanismes de filtrage partout où goodDog.size apparaît. Si vous utilisez la méthode getSize(), alors je la filtrerai dans cette méthode et tout ira bien. En fait, l'idée générale est de faire les choses dans une perspective orientée objet. Si vous voulez quelque chose, dites-le-moi et je viendrai à la maison le chercher pour vous, mais vous ne pouvez pas entrer directement dans la maison pour l'obtenir. Si vous ne connaissez pas ma maison, que dois-je faire si ma famille est en désordre ?

Si goodDog .size=12 est défini directement, ce n'est pas sûr. Que se passe-t-il si la valeur de size est inférieure à 10 ?
Est-il nécessaire de vérifier chaque paramètre d'attribut ? modifie uniformément la valeur et contrôle la plage pendant la méthode de définition, de sorte que lorsque les besoins changent à l'avenir, vous n'ayez pas à chercher des endroits partout dans le monde pour utiliser goodDog .size

Les méthodes avec paramètres et les méthodes sans paramètres dépendent de l'utilisation spécifique de la méthode. La méthode set et la méthode get doivent refléter l'idée d'encapsulation de la programmation orientée objet. Les variables membres sont définies sur privées et ne peuvent être modifiées. et accessible via des méthodes spécifiques pour assurer la sécurité du programme.

.

Il y a aussi la réponse ci-dessus, comme les beans java ou hibernate, lors de la suppression d'attributs, elle ne prend pas la taille d'attribut que vous avez définie, mais prend votre getSize, puis supprime le S minuscule de la méthode get pour obtenir la taille.

Ou si vous ne comprenez toujours pas, rappelez-vous ceci : L'existence est raisonnable. Un jour, en écrivant un certain morceau de code, vous vous en rendrez compte soudainement.

大家讲道理

Public peut être utilisé dans des scénarios simples. Les setters et les getters sont principalement fermés au monde extérieur. Vous pouvez ajouter un traitement unifié aux setters et aux getters, ce qui est également pratique pour la reconstruction.

刘奇

Je voudrais ajouter que pour masquer la visibilité, les méthodes setter et getter n'accèdent pas nécessairement directement aux valeurs, et une certaine logique de traitement peut également être ajoutée.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal