2010-10-05 11 views
19

Zajmuję się tworzeniem aplikacji na Androida i jestem bardzo nowy w Javie i Androidzie.Plik stałych Javy

Chcę utworzyć pewne stałe do użycia w niektórych czynnościach. Gdzie mogę zdefiniować te stałe?

Dzięki.

Odpowiedz

45

Jest uważany za złą praktyką w Javie, a większość języków OO, aby zdefiniować klasę po prostu trzymać stałe. Znacznie lepiej jest zdefiniować stałe w klasie, z którą są powiązane. Zwykle jest jeden. na przykład

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

Jeśli naprawdę nie ma nikogo, możesz zdefiniować oddzielną klasę.

EDIT: Najważniejsze rzeczy są tu:

  1. Bądź stałe łatwe do znalezienia. Jeśli istnieje "naturalne" miejsce, w którym można je umieścić, umieść je tam (tzn. Domyślna wysokość dla obiektów Component należy do klasy Component).
  2. Nie ma wyższego sprzężenia niż to konieczne. Umieszczenie wszystkich stałych w jednej klasie "stałych" powoduje wysokie sprzężenie, zwłaszcza że kolejne modyfikatory mają tendencję do umieszczania WSZYSTKICH stałych w klasie Constants, niezależnie od tego, czy istnieje inna klasa, którą można oczywiście umieścić.
  3. Tylko dlatego, że stała jest używana przez więcej niż jedną klasę, co nie oznacza, że ​​powinna być w klasie "stałych". Jeśli stała jest używana przez "Aplikację" i klasy korzystające z klasy aplikacji, należy umieścić ją w klasie Application. W ten sposób nie zwiększasz sprzężenia.
+0

interesujące, po prostu czytałem, że zmienne i stałe nie powinny znajdować się wewnątrz interfejsu dla czytelności kodu. Zgadzam się z tym, ponieważ uważam, że dobre nazewnictwo i klasa "stałych" jest znacznie lepsza, ponieważ większość stałych będzie używana w różnych klasach. Jeśli używasz stałych do "konfigurowania" aplikacji, dobrze jest mieć wszystko w jednym miejscu. – WarrenFaith

+3

Zmienne nie mogą znajdować się wewnątrz interfejsu. Stałe powinny być, jak sądzę, jeśli są odpowiednie dla wszystkich klas implementujących interfejs. Jeśli twoje stałe są używane przez WSZYSTKIE klasy, to tak, umieść je w klasie Constants (tak jak powiedziałem powyżej). Jeśli są używane do konfigurowania aplikacji, być może należą one do klasy Application. Kluczową sprawą jest sprawienie, by były łatwe do znalezienia i nie miały wysokiego sprzężenia z żadną klasą. Klasa Constants jest bardzo silnie sprzężona, jeśli nie jest traktowana z ostrożnością. – DJClayworth

18

Normalnie, można użyć klasy Stałe lub zdefiniować je w klasach, w których są one stosowane, a la:

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

Potem odnieść się do nich:

String inst = Constants.SOME_TEXT; 
+8

Znam twoje przykłady, ale chciałbym podkreślić, że nie należy używać CONST_ jako przedrostka dla stałych. ALL_CAPS jest standardowym sposobem wskazania stałej. –

+0

Można również utworzyć interfejs zamiast klasy. –

+0

Tak, to tylko przykład, i prawdopodobnie przypomina to tło pytającego, jeśli pochodzi z C/C++ (co jest odczuciem, które dostałem z pytaniem). – billjamesdev

0

Możesz zdefiniować pewne stałe w wyliczeniach Java.

Pojedynczy moduł wyliczający Java może zawierać wiele pól powiązanych danych.

Oracle zapewnia this introduction to Java enumerations.

+5

Dostęp do modułów wyliczających jest dość powolnym działaniem, w porównaniu do zmiennych lokalnych lub "statycznego finału" (który, o ile wiem, dostaje inline skompilowany przez kompilator java). Również Enumeratory mają dość duży nakład, jeśli chodzi o wykorzystanie pamięci/przestrzeni. Zobacz http://developer.android.com/guide/practices/design/performance.html#avoid_enums – Tseng

7

Najczęstszym sposobem jest stworzenie „constants” w klasach były one potrzebne:

class Example { 
    private static final int FILENAME = "test.txt; 
} 

Zamiast prywatny może być również uznane default, chronione lub publiczne. Chociaż jest uważane za OO anti pattern do definiowania stałych to specjalna klasa "stałych" (God), która przechowuje stałe dla całej aplikacji. Alternatywnie można również zapisać dane konfiguracyjne w postaci Java properties file, co nie jest uważane za wzorzec.

Inną opcją, która szybko zyskuje popularność, jest użycie wzoru Dependency Inject (DI). Często ten wzór jest używany dla obiektu zależnego, ale można go również wykorzystać do wprowadzania wartości stałych do obiektów.Może to na przykład być realizowane z lekkiej ramy Guice DI Google:

class Example { 
    String filename; 

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

W specjalnym Binder klasie będzie wiązać wartość do Strings opatrzone @ConfigFilename. W ten sposób masz minimalne sprzężenie i klasy, które mogą być niezależnie testowane.

+0

Jeśli korzystam z pliku właściwości na Androidzie. Gdzie mogę to umieścić? – VansFannel

+0

Istnieje kilka sposobów, na przykład czytanie pliku właściwości ze ścieżki klasy (katalog z klasami): http://www.javaworld.com/javaworld/javaqa/2003-08/01-qa-0808-property.html – Kdeveloper

+0

Sztylet jest fajny też https://github.com/square/dagger – Caipivara