Frage zu statischen Methoden
Ich bin neu bei Apex und der Entwicklung im Allgemeinen ...
Also spiele ich in Trailhead herum und mache ein paar Abzeichen.
Ich habe wie unten einen kleinen Code erstellt und habe keine tatsächliche Verwendung:
public class GenderIdentifier {
public void DetermineGender(String Gender){
if (Gender == 'Man'){
Gender = 'Male';
} else {
Gender = 'Female';
}
}
}
Wenn ich die Methode 'nicht statisch' mache, funktioniert sie und ich kann sehen, dass sie als anonymer Block gut ausgeführt wird.
Wenn ich es statisch mache, kann ich den anonymen Block nicht ausführen, da ich einen Fehler wie folgt erhalte:
Eine nicht statische Methode kann nicht aus einem statischen Kontext heraus referenziert werden: void GenderIdentifier.DetermineGender (String)
Was mache ich falsch? Es wäre sinnvoll, eine solche Methode als statisch zu haben. Ich glaube, ich habe das Konzept der statischen Methoden falsch verstanden.
Antworten
Etwas, das statisch ist, befindet sich "außerhalb" des Instanzspeichers. Mit anderen Worten, es ist ein gemeinsames Element für alle Kopien einer Klasse. Zum Beispiel bei dieser Klasse:
public class MyClass {
public static Integer number;
public String value;
}
Versuchen wir mal einen Code:
MyClass c1 = new MyClass(), c2 = new MyClass();
c1.value = 'Hello';
c2.value = 'World';
MyClass.number = 42;
Die Erinnerung würde ungefähr so aussehen:
Static Instances
+--------------+-----------------+
| | value: 'Hello' |
| number: 42 +-----------------+
| | value: 'World' |
+--------------+-----------------+
Die Nummer 42 ist für alle Kopien von MyClass sowie außerhalb der Klasse zugänglich (in diesem Fall, weil es so ist public). Beachten Sie, dass es nur ein Feld für die statische Variable gibt. Wenn Sie dort einen neuen Wert eingeben, wird der alte Wert rausgeschmissen. Es gibt immer nur eine Kopie von number, egal wie viele Instanzen existieren. Im Gegensatz dazu existieren die Instanzvariablen nur, wenn Instanzen vorhanden sind, und jede Instanz enthält eine Kopie der Variablen, die alle unabhängig voneinander festgelegt werden können.
In ähnlicher Weise funktionieren statische Methoden auf die gleiche Weise. Es gibt nur eine "Kopie" der Methode im Speicher. Es kann nicht direkt auf eine Instanz zugreifen, da es sich außerhalb aller Instanzen befindet. Instanzmethoden sind genau das Gegenteil; Sie erfordern eine Instanz von MyClassund können nicht außerhalb dieses Kontexts aufgerufen werden.
Als Nebeneffekt können statische Methoden aufgerufen werden, ohne das newSchlüsselwort zum Erstellen einer Instanz zu verwenden. Dies ist nützlich für praktische oder nützliche Methoden, mit denen Instanzdaten nicht bearbeitet werden. Sie können diese globalen Variablen und Methoden aufrufen.
Instanzmethoden (denen das staticSchlüsselwort fehlt ) können nur aufgerufen werden, nachdem eine Instanz der Klasse erstellt wurde. Sie sollten verwendet werden, wenn eine Instanz der Klasse vorhanden ist, um Daten zwischen mehreren Kopien einer Klasse zu unterscheiden.
Wenn Sie also neugierig sind, welche Sie verwenden sollten, fragen Sie sich einfach: "Funktioniert diese Methode mit einer einzelnen Dateninstanz?" Wenn ja, darf es nicht statisch sein, sonst kann es statisch sein. Es gibt traditionell unterschiedliche Verwendungszwecke für statische und Instanzmethoden und -variablen.
Webdienst-, REST-, Future-, Remote Action- und Lightning Controller-Methoden sind alle statisch. Sie arbeiten mit der globalen Kopie der Klasse, in der sie sich befinden. Visualforce-Controller und -Erweiterungen, SOAP / WSDL-Callouts, Schedulable, Batchable, Queueable, Iterables, Comparables, Messaging.InboundEmailHandler und andere Arten von Klassen, die mehrere gleichzeitige Daten enthalten können nicht statisch.
Die beiden Hauptunterschiede zwischen statischen und Instanzmethoden, die Sie kennen müssen, sind: Statische Methoden können von Instanzmethoden aus aufgerufen werden, Instanzmethoden können jedoch nicht direkt von statischen Methoden aufgerufen werden (Sie müssen eine Instanz übergeben), und einige spezielle Funktionen (viele Beispiele dafür, die im vorherigen Absatz aufgeführt sind, erfordern eine Art von Methode, um zu funktionieren (Sie können beispielsweise nicht statisch ersetzen oder umgekehrt).
Irgendwo in dieser Antwort ist begraben, wonach Sie fragen: Ist es sinnvoll, diese Art von Methode statisch zu haben? Ja; Die Methode ändert keine Instanzdaten und wird daher als Dienstprogrammmethode klassifiziert. Es ist sinnvoll, diese Methode statisch zu haben, genau wie String.isBlank oder Messaging.sendEmail. Sie benötigen keine Instanz der Klasse, damit diese Methode erfolgreich ist. Es gibt also keinen Grund, warum Sie sie unbedingt zu einer Instanzmethode machen sollten, da Sie auf diese Weise einfach Tastenanschläge und CPU-Zeit verschwenden.
Beachten Sie, dass die Ausführung von Anonym etwas seltsam ist, wenn Sie Apex ausführen. Was Execute Anonymous angeht, hätten Sie schreiben können:
public void DetermineGender(String Gender){
if (Gender == 'Man'){
Gender = 'Male';
} else {
Gender = 'Female';
}
}
System.debug(DetermineGender('Man'));
Da Execute Anonymous unsichtbar Ihren gesamten Block umschließt, handelt es sich um eine anonyme (unbenannte) Klasse. Dies hat einige interessante Nebenwirkungen in Bezug auf die Zusammenstellung. Ich empfehle, wenn möglich tatsächliche Klassen zu verwenden, da die Regeln für die Kompilierung im Vergleich zu Anonymen Skripten ausführen "normaler" sind.
Sie rufen eine statische Methode wie folgt auf:
MyClass.myMethod(/*parameters*/)
Sie rufen eine Instanzmethode wie folgt auf:
new MyClass().myMethod(/*parameters*/)
Statische Variablen oder Methoden gehören nicht zu einer Instanz einer Klasse, während eine nicht statische Variable oder Methode zur Instanz gehört.
Um nicht statische Variablen oder Methoden aufzurufen, müssen Sie zuerst die Klasse instanziieren. Zum Beispiel
public class GenderIdentifier {
public void DetermineGender(String Gender){
if (Gender == 'Man'){
Gender = 'Male';
} else {
Gender = 'Female';
}
}
}}
Um DetermineGender aufzurufen, müssen Sie die folgenden Schritte ausführen:
GenderIdentifier obj = new GenderIdentifier();
obj.DetermineGender(pass the var)
Eine statische Methode aufrufen:
public class GenderIdentifier {
public static void DetermineGender(String Gender){
if (Gender == 'Man'){
Gender = 'Male';
} else {
Gender = 'Female';
}
}
}}
Sie müssen diesen Code ausführen: GenderIdentifier.DetermineGender(pass your var)
Lassen Sie mich wissen, wenn Sie weitere Informationen benötigen.