2010-12-17 10 views
0

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?

+0

Der Compiler wird es optimieren, aber warum nicht ein weiteres letztes Feld für 'XY_ENDPOINT_URL' erstellen? – khachik

+0

Ok, dann: public static final Zeichenfolge ENDPOINT_XY_URL = SERVER_BASE_URL + "/ xy"; – OneWorld

Antwort

3

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.

+0

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

+0

Prefs-Objekt klingt gut für mich ;-) (Beachten Sie jedoch, dass Ihr Schema mit statischen Variablen überhaupt keine Prefs-Objekte enthält.) – aioobe

+0

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

0

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.

+0

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

+1

@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

1

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; 
    } 

} 
+0

"Versuchen Sie, sie zu vermeiden, wann immer möglich." http://developer.android.com/guide/practices/design/performance.html#prefer_static – OneWorld

+1

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. –

Verwandte Themen