2012-04-13 2 views
1

Ich möchte eine Hilfsklasse wie Convert oder Utils in meiner Android App haben. Typische Frage, die ich habe, ist:Ist Subclassing-Anwendung die einzige Möglichkeit, statische Hilfsmethoden in Android zu implementieren?

public class Convert { 

    private Convert() { 
     // I can't be instantiated 
    } 

    public static int pxToDp(float pixels) { 
     DisplayMetrics displayMetrics = getResources().getDisplayMetrics(); 
     return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, pixels, displayMetrics); 
    } 
} 

Die oben nicht natürlich, weil Convert keine Ahnung, was GetResources() hat, ist. das lässt mich also zwei Möglichkeiten:

  1. einem Kontext passieren jedes Mal, wenn ich eine Hilfsmethode verwenden möchten, die
  2. Unterklasse Anwendung Müll ist, mein Manifest ändern, dann einen Verweis erstellen, wie folgt aus:

    public class App extends Application { 
    
        private static Context mContext; 
    
        @Override 
        public void onCreate() { 
         super.onCreate(); 
         mContext = this; 
        } 
    
        public static Context getContext() { 
         return mContext; 
        } 
    } 
    

tun dann App.getContext() überall ich es brauche.

Frage: das kann nicht richtig sein, was ist der elegante Weg, um fortzufahren?

+0

Ich wünschte, ich könnte das mehr als einmal +1 geben - ich persönlich ging mit dem "Passing Context als Argument" und fühlte sich schrecklich daran ... – mfrankli

+0

Was ist los mit Subclassing Application? –

Antwort

5

Wenn Sie Anwendung, die offensichtlich funktioniert, aber Sie können am Ende mit einer enormen, schrecklichen Klasse, die eine ganze Reihe von Sachen, die nicht verwandt ist - eine Cruise über das Prinzip der Single Responsibility.

Ja, es ist ein wenig unordentlich und lästig, einen Kontext in eine Dienstprogrammklasse zu übergeben, aber es bedeutet, dass Sie Klassen für jeden Dienstprogrammtyp (z. B. StringUtils oder was auch immer) erstellen und die Verantwortlichkeiten zumindest trennen können.

Ich rate davon ab, App.getContext überall zu verwenden, da dies bedeutet, dass alle Ihre Dienstprogrammklassen von der App abhängig sind, was es schwierig macht, sie wiederzuverwenden. Wenn Sie einen Kontext übergeben, können Sie einige der Dienstprogrammklassen in anderen Apps einfacher wiederverwenden.

Also würde ich sagen, verwenden Sie separate Klassen, und übergeben Sie diesen Kontext in die Methoden. Es ist ein bisschen hässlich, aber meiner Meinung nach viel weniger hässlich als die Alternativen.

+0

Das ist richtig. Wenn Sie viel in Android programmiert haben, werden Sie feststellen, dass die API genau das tut. Das einzige Problem damit ist der zusätzliche Aufwand beim Aufruf Ihrer Utility-Klasse-Methode. Wenn Ihre Dienstprogrammklasse nicht statisch sein muss, können Sie einfach ein Mitgliedsfeld erstellen, das einen Kontext enthält, der für die Instanziierung übergeben wurde. Dies würde auch funktionieren und verhindern, dass man jedes Mal einen passieren muss. Der Nachteil hierbei ist, dass Ihre Methoden der Dienstprogrammklasse nicht mehr als statisch deklariert werden können, wenn sie von der Klasse abhängen, die instanziiert wird. – dcow

+0

Und ich bin sicher, dass Sie nicht wollen, dass ein Haufen Utility-Klassen Ihre kostbare Erinnerung verstopft. Also könntest du es zu einem Singleton machen. Dies würde jedoch bedeuten, dass es nur mit einem Kontext gleichzeitig funktioniert. Das mag in Ordnung sein, aber idealerweise sollte eine Dienstprogrammklasse aus jedem Kontext aufgerufen werden. – dcow

0

passieren einen Kontext jedes Mal, wenn ich eine Hilfsmethode verwenden möchten, die

Müll ist, dass wie OOP Religion klingt für mich. Ich würde tatsächlich in der DisplayMetrics übergeben, denn das ist, was die Funktion wirklich benötigt, um ihre Antwort zu berechnen.

Verwandte Themen