[JAVA] Verwendung der Getter / Setter-Methode (in Objektorientierung)

Ich höre oft Leute sagen: "Ich bin es leid, die Getter / Setter-Methode einzeln zu schreiben, aber warum sollte ich sie schreiben? Wo soll ich sie schließlich schreiben?", Also schrieb ich sie als Artikel.

(100% Garantie, dass Masakari fliegen wird)

Darüber hinaus werden Wörter mit ähnlichen Eigenschaften wie Felder, Instanzvariablen, Eigenschaften und Elementvariablen hier nicht ordnungsgemäß verwendet, sondern gemeinsam als Felder bezeichnet. Darüber hinaus werden Methoden, Elementfunktionen usw. auch gemeinsam als Methoden bezeichnet.

Grundsätzlich,

Zunächst werde ich kurz erklären, wie das Konzept der Getter / Setter-Methode geboren wurde.

Eine Eigenschaft objektorientierter Programme ist der Polymorphismus. Dies ist zum Beispiel

Es ist die Natur.

Mit anderen Worten, Sie programmieren für die Schnittstelle, nicht für die Implementierung. Dies ermöglicht es, die Kosten für die Softwareentwicklung zu senken.

Wenn Sie ein Programm für eine Schnittstelle schreiben, dh ein Programm, das die Abhängigkeit von der Implementierung so weit wie möglich beseitigt, ist es am wichtigsten, den konkreten Implementierungsteil unzugänglich zu machen (Kapselung). Felder sind nur in der internen Implementierung enthalten, daher müssen wir eine alternative Methode bereitstellen, um zu verhindern, dass direkt von außen auf sie zugegriffen wird. Dies erzeugt das Muster "Vorbereiten einer Methode zum Erfassen der Daten von außen oder einer Methode zum Ändern der Daten von außen für ein bestimmtes Feld". Die diesem Muster entsprechende Methode wurde später als "Getter / Setter-Methode" bezeichnet.

Das Schreiben eines Beispiels für die Verwendung der Getter / Setter-Methode in Java sieht folgendermaßen aus

class User{
    private String name;

    public String getName(){
        return name;
    }

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

Dies ist die, die Sie oft sehen.

Übrigens denke ich, dass Smalltalk das Konzept der Kapselungs- und Getter / Setter-Methoden am besten widerspiegelt. Dies liegt daran, dass in Smalltalk das Zugriffsqualifikationsmerkmal einer Instanzvariablen (in Java usw.) nicht von protected geändert werden kann.


Object subclass: #User
    instanceVariableNames: 'name'

User>>name
    ^ name

User>>name: aName
    name := aName

Hier unterscheidet sich die Setter / Getter-Methode von Smalltalk oder seiner OOPL-Reihe vom üblichen Stil und hat die Form name, name: wie im obigen Beispiel. (Es ist wirklich schön ...)

Aber es gibt Ausnahmen (?)

Die Getter / Setter-Methode hat auch den Nachteil, dass der Code redundant wird. Wenn Sie im folgenden Beispiel nur drei Felder definieren, wird der Code aufgebläht.

class User{
    private String name;
    private int age;
    private boolean isAdmin;

    public String getName(){
        return name;
    }

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

    public int getAge(){
        return age;
    }

    public void setAge(int age){
        this.age = age;
    }

    public boolean getIsAdmin(){
        return isAdmin;
    }

    public void setIsAdmin(boolean isAdmin){
        this.isAdmin = isAdmin;
    }
}

In einigen Fällen ist es besser, keine Getter / Setter-Methode zu definieren.

Bei Verwendung von PI

PI (Persistence Ignorance) ist ein Muster der Klasse, das sich "nur als Struktur verhält". Alias POJO (einfaches altes Java-Objekt). Mit diesem Muster kann der obige Java-Code wie folgt umgeschrieben werden:

class User{
    public String name;
    public int age;
    public boolean isAdmin;
}

In einer einfachen Struktur verhält sich das Feld selbst wie eine Schnittstelle, sodass keine redundanten Setter / Getter-Methoden geschrieben werden müssen, und es ist in Ordnung, es so in einem objektorientierten Programm zu schreiben.

Dieses Muster wird häufig in Modellklassen und dergleichen verwendet.

Bei Verwendung von ActiveRecord, Eloquent ORM usw.

Mit ActiveRecords wie Ruby on Rails und Laravel können Sie dynamisch auf Felder zugreifen, die nicht in Ihrem Code definiert sind.

Zum Beispiel in Laravel

class User extends Model{

}

$user = User::first();
$user->id; //1 oder so
$user->name; //ogiwara

In solchen Fällen ist es natürlich nicht erforderlich, die Getter / Setter-Methode einzeln zu definieren.

Übrigens, auch wenn es nicht im Code definiert ist, wenn es PHP ist, ist @property usw. PHPDoc Wenn Sie es einschreiben, erhalten Sie Unterstützung von IDE usw., schreiben Sie es also wie folgt.


/**
 * @property int $id
 * @property string $name
 */
class User extends Model{

}

Es ist in die Sprachspezifikation eingebaut

Kotlin, C # usw. haben Sprachspezifikationen, die das Schreiben von Getter / Setter-Methoden erleichtern. Erwägen Sie in Kotlin, dasselbe Benutzermodell zu erstellen, das oben in Java erstellt wurde.

class User{
    public name: String
    public age: Int
    public isAdmin: Boolean
}

Wenn Sie hier die Spezifikationen ändern, z. B. "Um ein Protokoll zu hinterlassen, wenn auf das Namensfeld zugegriffen wird", schreiben Sie einfach wie folgt um.


class User{
    public name: String
        get(){
            println("Auf den Namen wurde zugegriffen")
            name
        }
    public age: Int
    public isAdmin: Boolean
}

Mit anderen Worten, "die Verarbeitung kann später für die Erfassung und Änderung von Feldern erweitert werden." Diese Funktion kann wie folgt auch als Felddelegation dienen:

class User{
    private realName: String
    public name: String
        get(){
            realName
        }
        set(value){
            realName = value
        }
}

Diese Funktion wird in Kotlin, C # unter dem Namen "Getter / Setter" bereitgestellt.

Zusammenfassung

Ich bin sehr zufrieden mit Sprachspezifikationen, die später erweitert werden können, wie Kotlin und C #.

Recommended Posts

Verwendung der Getter / Setter-Methode (in Objektorientierung)
Verwendung der link_to-Methode
Verwendung der include? -Methode
Verwendung der Methode form_with
[Schienen] Verwendung der Kartenmethode
[Java] Verwendung der toString () -Methode
Ausgabe der Verwendung der Slice-Methode
Verwendung der replace () -Methode (Java Silver)
[Ruby-Grundlagen] Verwendung der Slice-Methode
So erhalten Sie den Namen einer Klasse / Methode, die in Java ausgeführt wird
Wie man Lombok im Frühling benutzt
[Java] Verwendung der Join-Methode
Verwendung der Wrapper-Klasse
So erstellen Sie ein Platzhalterteil zur Verwendung in der IN-Klausel
Verwendung von InjectorHolder in OpenAM
Wie verwende ich Klassen in Java?
Verwendung der Ruby-Inject-Methode
Speichern der im Textbereich eingegebenen Informationen in einer Variablen in der Methode
Mehrsprachige Unterstützung für Java Verwendung des Gebietsschemas
[Java] Verwendung der File-Klasse
Verwendung des benannten Volumes in docker-compose.yml
Verwendung der Submit-Methode (Java Silver)
Studieren der Verwendung des Konstruktors (Java)
[Verarbeitung × Java] Verwendung der Schleife
Wie man Parameter in der link_to-Methode hat
Verwendung von Docker in VSCode DevContainer
Verwendung von MySQL im Rails-Tutorial
[Verarbeitung × Java] Verwendung der Klasse
So erhalten Sie das Datum mit Java
[Verarbeitung × Java] Verwendung der Funktion
Verwendung von Umgebungsvariablen in RubyOnRails
[Java] Verwendung der Calendar-Klasse
Verstehe in 5 Minuten !! Wie man Docker benutzt
[Rails] Verwendung der Hilfsmethode, Confimartion
Verwendung von credentials.yml.enc aus Rails 5.2
Verwendung von ExpandableListView in Android Studio
Android-Entwicklung, wie man den Wert des JSON-Objekts auf null überprüft
So verweisen Sie auf eine Spalte, wenn Sie die Spaltennamensmethode in ActiveRecord überschreiben
Verwendung des Kameramoduls OV7725 (ESP32-WROVER-B)
So überprüfen Sie das Protokoll im Docker-Container
[Rails] Verwendung von Auswahlfeldern in Ransack
[Ruby] Verwendung der gsub-Methode und der sub-Methode
Wenn Sie die Methode außerhalb verwenden möchten
Verwendung von JQuery in Rails 6 js.erb
So erstellen Sie die einfachste Blockchain in Ruby
[Rails] Verwendung von PostgreSQL in einer Vagrant-Umgebung
So überprüfen Sie Rails-Befehle im Terminal
Möglicherweise möchten Sie die Methode remove in ArrayList nicht sehr oft verwenden
[Rails] So bedienen Sie die in der Hauptanwendung verwendete Hilfsmethode mit Administrate
Verwendung von Map
Wie benutzt man rbenv?