Ich stelle Einstellungen meines JAVA-Projekts in einer Prefs.java-Klasse mit statischen Attributen und statischen Methoden bereit. Das Token für OAuth2 muss jedoch zur Laufzeit zugewiesen werden. Ist das ein guter Weg zu gehen ...?Ist es in Ordnung, statische Attribute zur Laufzeit zu manipulieren?
Antwort
Ich würde gegen solche Design raten. Dieser Typ von statischen Variablen ist nicht besser als globale Variablen. This page gibt ein paar Gründe, warum Sie sie vermeiden sollten. Hier sind ein paar von ihnen.
- Nichtlokalität
- keine Zugriffskontrolle oder Constraint-Prüfung
- Implizite Kopplung
- Concurrency gibt
- Testing und Confinement
Aber das Token für OAuth2 muss sein zur Laufzeit zugewiesen. Ist das ein guter Weg zu gehen ...?
Hier scheint es mir wirklich so, als würden Sie ein solches Token an den Konstruktor des Prefs-Objekts übergeben.
Ich erstelle eine Bibliothek für Android, die eine API auf hoher Ebene für unsere Web-API bereitstellt. Das access_token zu persistieren ist nicht meine Aufgabe. Der Implementierer meiner lib muss sich darum kümmern. Aber ich habe noch keinen geeigneten Platz gefunden, um das Access Token zu speichern. Ich dachte, der einfachste Weg für den Implementierer wäre das Prefs-Objekt – OneWorld
Prefs-Objekt klingt gut für mich ;-) (Beachten Sie jedoch, dass Ihr Schema mit statischen Variablen überhaupt keine Prefs-Objekte enthält.) – aioobe
Vielleicht hätte ich Prefs-Klasse sagen sollen, da es keine Instanz hat. Also in diesem Fall (Bibliothek für andere Leute) empfehlen Sie diesen Weg zu gehen? Was meinst du mit Prefs-Objekten? – OneWorld
In der Regel werden globale Konfigurationsdateien zur Laufzeit aus Eigenschaftendateien gelesen. Sie können verschiedene Konfigurationsdateien für die Entwicklungs-, QS- und Produktionsumgebungen verwenden.
Sie müssen sich nur darüber im Klaren sein, dass Sie in einer Webanwendung, wenn Sie statische Variablen aus einer Webanfrage setzen, die Daten munge, wenn Sie den Setter nicht synchronisieren. Wenn Sie nur lesen, dann sollte es Ihnen gut gehen.
Eine Alternative zu dem, was Sie tun, ist warum nicht den OAuth-Schlüssel in einen Dienst injizieren, der die Authentifizierungsanliegen Ihres Systems behandelt? Sie könnten tun, was Sie mit einer statischen Ressource machen müssen, aber in diesem Fall sollten Sie sich bewusst sein, dass Sie keine statische Variable benötigen, um den Schlüssel zu halten.
Ich überschreibe bereits eine Methode meines HttpClient, so dass das access_token "injiziert" wird oder an die URL angehängt werden kann. TokenizedHttpClient.getInstance(). SetToken ("gqwertz"); sieht im Vergleich zu Prefs.setToken ("fghj") schrecklich aus; für einen Implementierer meiner lib (siehe auch Kommentar zu aioobes Antwort) – OneWorld
@oneworld, ja ich stimme zu, dass statische Eigenschaften nicht wirklich eine gute Lösung für diese Art von Sache sind. Aber Sie können es so machen, und der Sinn der Antwort besteht darin, Sie auf die Gefahren aufmerksam zu machen und eine Alternative zu präsentieren. – hvgotcodes
Statische Variablen sind objektorientierte Substitute für globale Variablen in C. Versuchen Sie diese nach Möglichkeit zu vermeiden.
Oftmals benötigen Sie nur ein Objekt, in Ihrem Fall ist es das Prefs-Objekt.
public class Prefs {
//known before runtime
public final String SERVER_BASE_URL ="http://api.mycompany.com/";
//needs to be set on startup through the setter method
private String token;
public String getToken() {
return token;
}
public void setToken(String token) {
Prefs.token = token;
}
public String getXyEndpointUrl() {
return SERVER_BASE_URL + "/xy";
}
}
public class Program {
protected Prefs prefs;
protected Other prefsAware;
public Program() {
prefs = new Prefs();
prefsAware = new Other(prefs);
}
// or even (if you don't like constructor mediated passing of prefs)
public Prefs getPrefs() {
return prefs;
}
}
"Versuchen Sie, sie zu vermeiden, wann immer möglich." http://developer.android.com/guide/practices/design/performance.html#prefer_static – OneWorld
Es gibt Unterschiede zwischen gutem objektorientiertem Design und was auf meiner Plattform schnell läuft. Android kann schneller auf statische Daten zugreifen, aber wenn es statisch gemacht wird, beeinträchtigt dies die Wartbarkeit. Vielleicht optimieren Sie vorzeitig? Wahrscheinlichkeiten sind, dass Sie diesen Gegenstand nur zwei oder drei Mal lesen werden, und ein gutes objektorientiertes Design wird Ihnen erlauben, in den anderen Teilen des Programms zu beschleunigen, wo es zählt. Oder Sie könnten einfach die ganze Sache in "C eingebettet in Java" schreiben. –
- 1. Ist es in Ordnung HTML in HTML-Attribute zu setzen?
- 2. Ist es in Ordnung, HTML-Elementen eigene Attribute hinzuzufügen?
- 3. DataContracts DataMember-Attribute zur Laufzeit setzen?
- 4. Methodenaustausch zur Laufzeit nicht aktualisiert Private Attribute
- 5. Ist es in Ordnung, downcast?
- 6. Ist es in Ordnung, dom vor dem Bereit-Zustand zu manipulieren?
- 7. Ist es in Ordnung, mit() zu verwenden?
- 8. Core Data Vererbung: Ist es in Ordnung, dies zu tun?
- 9. Ist es möglich, eine Klassenzusammenfassung zur Laufzeit zu erhalten?
- 10. Ist es möglich, Variablen zur Laufzeit zu beobachten?
- 11. Ist es in Ordnung, Destruktor als privat zu deklarieren?
- 12. Ist es in Ordnung, das Ansichtsmodell als statische Ressource in einer Ansicht zu deklarieren?
- 13. statische Variable Ordnung
- 14. Ist es möglich, Lambda-Ausdruck zur Laufzeit abrufen
- 15. Wie füge ich einer Methode zur Laufzeit Attribute hinzu?
- 16. Ist es in Ordnung, divs in einer Tabellenzelle zu verschachteln?
- 17. Ist es in Ordnung, UITableViewCells in einem Array zu speichern?
- 18. Ist es in Ordnung, Rendering in React zu delegieren?
- 19. Ist es in Ordnung, widersprüchliche Einschränkungen in Xcode zu ignorieren?
- 20. Ist es in Ordnung, einige IDs in HTML zu zeigen?
- 21. ist es in Ordnung, Vektor in einem Destruktor zu löschen
- 22. Ist es möglich, ein Unterprogramm zur Laufzeit in ein anderes Unterprogramm zu übersetzen und zu übergeben?
- 23. Ist es möglich, Ausgabeargumente zur Laufzeit dynamisch anzugeben
- 24. Ist es in Ordnung, C++ anzupassen?
- 25. Cmake: statische Verknüpfung erfordert Bibliotheken zur Laufzeit (appcrash 0xC0000135)
- 26. column.OptionsFilter.ImmediateUpdateAutoFilter Wie man es zur Laufzeit setzt
- 27. C++ statische Umwandlung mit .so Laden zur Laufzeit
- 28. Ist es in Ordnung, 'void *' freizugeben?
- 29. Lasten von if's, ist es in Ordnung?
- 30. Ist es in Ordnung, AWT mit JavaFx zu verwenden?
Der Compiler wird es optimieren, aber warum nicht ein weiteres letztes Feld für 'XY_ENDPOINT_URL' erstellen? – khachik
Ok, dann: public static final Zeichenfolge ENDPOINT_XY_URL = SERVER_BASE_URL + "/ xy"; – OneWorld