2010-10-05 21 views
19

Bir Android uygulaması geliştiriyorum ve Java ve Android'de çok yeniyim.Java sabitleri dosyası

Bazı etkinliklerde kullanmak için bazı sabitler oluşturmak istiyorum. Bu sabitleri nerede tanımlayabilirim?

Teşekkürler.

cevap

45
java da kötü uygulama olarak kabul edilir

ve en OO dilleri, sabitlerini tutmak için sadece bir sınıf tanımlamak için sağlar. İlişkilendirildikleri bir sınıftaki sabitleri tanımlamak daha iyidir. Genellikle bir tane var. Örneğin.

interface MyComponent { 
    /** The default height for a component */ 
    public static final int DEFAULT_HEIGHT = 5; 
    // other stuff 
} 

gerçekten varsa değil biri ayrı bir sınıf tanımlamak için çekinmeyin.

DÜZENLEME: Burada anahtar noktalar şunlardır:

  1. bulmak sabitler kolaylaştırın. Bunları koymak için 'doğal' bir yer varsa, oraya koyun (yani Bileşen nesneleri için varsayılan yükseklik Bileşen sınıfına aittir).
  2. İhtiyaç duyduğunuzdan daha yüksek bir bağlantıya sahip değilsiniz. biri 'Sabitler' sınıfındaki tüm sabitleri koymak sonraki düzenleyiciler sonra onlar doğal koymak olabilir başka sınıf olup olmadığını ya da olmasın, Sabitler sınıfında TÜM sabitleri koymak eğilimi, özellikle yüksek bağlantı yapar. Sadece bir nedeni
  3. Sabit, bir "Sabitler" sınıfında olması gerektiği anlamına gelmeyen, birden fazla sınıf tarafından kullanılır. Bir sabit, 'Uygulama' ve Uygulama sınıfı'u kullanan sınıflar tarafından kullanılıyorsa, bunu Uygulama sınıfına yerleştirin. Bu şekilde kuplajı arttırmıyorsunuz.
+0

adresine bakın, sadece değişkenlerin ve sabitlerin kod okunabilirliği için bir arayüz içinde olmamasını okudum. Buna katılıyorum, çünkü iyi bir isimlendirme ve bir “Sabirler” sınıfının daha iyi olduğunu düşünüyorum çünkü çoğu sabit farklı sınıflarda kullanılacaktır. Uygulamayı "yapılandırmak" için sabitler kullanıyorsanız, aynı zamanda tek bir yerde herhangi birşeye sahip olmak da iyidir – WarrenFaith

+3

Değişkenler bir arabirimin içinde olamaz. Sabitler, inanıyorum ki, arayüzü uygulayan tüm sınıflar ile alakalıysa. Eğer sabitleriniz ALL sınıfları tarafından kullanılıyorsa, o zaman evet, bir Constants sınıfına koyun (yukarıda söylediğim gibi). Uygulamayı yapılandırmak için kullanılıyorsa, belki de Uygulama sınıfına aittirler. En önemli şey, onları bulmayı kolaylaştırmak ve herhangi bir sınıfa yüksek bir bağla sahip olmamaktır. Bir Constants sınıfı, dikkatli bir şekilde tedavi edilmezse, çok yüksek bir bağlanma eğilimindedir. – DJClayworth

18

Normalde, a la, bir Sabitler sınıfını kullanabilir veya kullanıldıkları sınıflarda onları tanımlarsınız:

String inst = Constants.SOME_TEXT; 
+8

Sadece gösterdiğiniz örnekleri biliyorum, ancak CONST_'in sabitler için bir önek olarak kullanılmaması gerektiğini vurgulamak isterim. ALL_CAPS, bir sabiti belirtmenin standart yoludur. –

+0

Ayrıca, bir sınıf yerine bir arayüz de yapabilirsiniz. –

+0

Doğru, bu sadece bir örnektir ve muhtemelen C/C++'dan geliyorsa (ki bu sorudan kurtuldum hissi) askerin arka planını hatırlatıyor. – billjamesdev

0

:

class Constants { 
    public static final int NUM_TRIANGLES = 4; 
    public static final String SOME_TEXT = "This is a constant"; 
} 

Sonra kendilerine başvurmak istiyorum Java numaralandırmalarında bazı sabitleri tanımlayabilirsiniz. Tek bir Java numaralandırıcısı, ilişkili verilerin birden çok alanını tutabilir.

Oracle this introduction to Java enumerations.

+5

Sayımcılara erişmek, yerel değişkenlere veya "statik final" e göre oldukça yavaş bir işlemdir (bildiğim kadarıyla java derleyicisi tarafından satır içi derlenir). Ayrıca, Sayımlar bellek/alan kullanımı söz konusu olduğunda oldukça yüksek bir yüke sahiptir. Http://developer.android.com/guide/practices/design/performance.html#avoid_enums – Tseng

7

en yaygın yolu onlara ihtiyaç sınıflarda 'constants' yaratmak idi şudur:

yerine o da korumalı veya kamu, default bildirilebilir özel bir
class Example { 
    private static final int FILENAME = "test.txt; 
} 

. Sabitleri tanımlamak için bir OO anti pattern kabul edilmesine rağmen, tüm uygulama için sabitleri saklayan özel bir 'sabit' (God) sınıfıdır. Alternatif olarak, yapılandırma verilerini bir Java properties file'da da saklayabilirsiniz, bu bir anti-desen olarak kabul edilmez.

Diğer bir seçenek, o hızla popülerlik kazanıyor, Dependency Inject (DI) desen kullanımıdır. Genellikle bu desen bağımlı nesne için kullanılır, ancak aynı zamanda nesneler içine sabit değerler enjekte etmek için de kullanılabilir.Bu örneğin Google'ın hafif Guice DI çerçeve ile uygulanacak: Özel bir Binder sınıfında

class Example { 
    String filename; 

    @Inject 
    public Example(@ConfigFilename String filename) { 
    this.filename = filename;   
    } 

Eğer @ConfigFilename ile açıklamalı Strings bir değer bağlayacaktır. Bu şekilde, bağımsız olarak test edilebilecek minimum birleştirme ve sınıflara sahipsiniz.

+0

Android'de bir özellik dosyası kullanırsam. Onu nereye koyabilirim? – VansFannel

+0

Örneğin, sınıf yolundan özellik dosyasını okumanın birkaç yolu vardır (sınıfları olan dizin): http://www.javaworld.com/javaworld/javaqa/2003-08/01-qa-0808-property.html – Kdeveloper

+0

Hançer çok havalı https://github.com/square/dagger – Caipivara