Accessors en mutators

Een van de manieren waarop we gegevensinkapseling kunnen afdwingen, is door gebruik te maken van accessors en mutators. De rol van accessors en mutators is om terug te keren en de waarden van de status van een object in te stellen. Dit artikel is een praktische gids over hoe u ze in Java kunt programmeren.

Als voorbeeld ga ik een persoonsklasse gebruiken met de volgende status en constructor al gedefinieerd:

> public class Person {// Private fields private String firstName; private String middleNames; private String lastName; privé String-adres; private String gebruikersnaam; // Constructormethode public Person (String firstName, String middleNames, String lastName, String address) {this.firstName = firstName; this.middleNames = middleNames; this.lastName = lastName; this.address = adres; this.username = ""; }}

Accessor-methoden

Een accessor-methode wordt gebruikt om de waarde van een privéveld te retourneren. Het volgt een naamschema dat het woord "get" voorafgaat aan het begin van de methode naam. Laten we bijvoorbeeld accessor-methoden toevoegen voor voornaam, middelste naam en achternaam:

> // Accessor voor firstName public String getFirstName () {return firstName; } // Accessor voor middleNames openbaar String getMiddlesNames () {return middleNames; } // Accessor voor lastName public String getLastName () {return lastName; }

Deze methoden retourneren altijd hetzelfde gegevenstype als het bijbehorende privéveld (bijvoorbeeld tekenreeks) en retourneren vervolgens eenvoudig de waarde van dat privéveld.

We hebben nu toegang tot hun waarden via de methoden van een Persoon-object:

> public class PersonExample {public static void main (String [] args) {Person dave = new Person ("Dave", "Bob Bill", "Davidson", "12 Pall Mall"); System.out.println (dave.getFirstName () + "" + dave.getMiddlesNames () + "" + dave.getLastName ()); }}

Mutator-methoden

Een mutator-methode wordt gebruikt om een ​​waarde van een privé-veld in te stellen. Het volgt een naamschema dat het woord "set" voorvoegt bij het begin van de methode. Laten we bijvoorbeeld mutatorvelden voor adres en gebruikersnaam toevoegen:

> // Mutator voor adres public void setAddress (String address) {this.address = address; } // Mutator voor gebruikersnaam public void setUsername (String gebruikersnaam) {this.username = gebruikersnaam; }

Deze methoden hebben geen retourneringstype en accepteren een parameter die hetzelfde gegevenstype is als het bijbehorende privéveld. De parameter wordt dan gebruikt om de waarde van dat privéveld in te stellen.

Het is nu mogelijk om de waarden voor het adres en de gebruikersnaam binnen het Persoon-object te wijzigen:

> public class PersonExample {public static void main (String [] args) {Person dave = new Person ("Dave", "Bob Bill", "Davidson", "12 Pall Mall"); dave.setAddress ("256 Bow Street"); dave.setUsername ( "DDavidson"); }}

Waarom accessoren en mutators gebruiken?

Het is gemakkelijk om tot de conclusie te komen dat we de privévelden van de klassendefinitie gewoon publiek kunnen maken en dezelfde resultaten kunnen bereiken. Het is belangrijk om te onthouden dat we de gegevens van het object zo veel mogelijk willen verbergen. De extra buffer die deze methoden bieden, stelt ons in staat om:

Laten we zeggen dat we besluiten om te wijzigen hoe we middennamen opslaan. In plaats van slechts één String gebruiken we nu een reeks strings:

> private String firstName; // Nu met behulp van een array van Strings private String [] middleNames; private String lastName; privé String-adres; private String gebruikersnaam; public Person (String firstName, String middleNames, String lastName, String address) {this.firstName = firstName; // maak een array van strings this.middleNames = middleNames.split (""); this.lastName = lastName; this.address = adres; this.username = ""; } // Accessor voor middleNames openbaar String getMiddlesNames () {// retourneer een tekenreeks door alle tekenreeksen van middleNames samen toe te voegen StringBuilder-namen = new StringBuilder (); for (int j = 0; j <(middleNames.length-1); j ++) {names.append (middleNames [j] + ""); } names.append (middleNames [middleNames.length-1]); return names.toString (); }

De implementatie in het object is gewijzigd, maar de buitenwereld wordt niet beïnvloed. De manier waarop de methoden worden genoemd, blijft precies hetzelfde:

> public class PersonExample {public static void main (String [] args) {Person dave = new Person ("Dave", "Bob Bill", "Davidson", "12 Pall Mall"); System.out.println (dave.getFirstName () + "" + dave.getMiddlesNames () + "" + dave.getLastName ()); }}

Of laten we zeggen dat de toepassing die het Persoon-object gebruikt alleen gebruikersnamen kan accepteren die maximaal tien tekens bevatten. We kunnen validatie toevoegen in de setUsername mutator om te controleren of de gebruikersnaam voldoet aan deze vereiste:

> public void setUsername (String gebruikersnaam) {if (gebruikersnaam.length ()> 10) {this.username = gebruikersnaam.substring (0,10); } else {this.username = gebruikersnaam; }}

Als de gebruikersnaam die is doorgegeven aan de mutatie setUsername langer is dan tien tekens, wordt deze automatisch afgekapt.