Budowanie aplikacji wielojęzycznej w Javie. Pojawia się błąd podczas wstawiania wartości ciągu z R.string
pliku XML zasobu:
public static final String TTT = (String) getText(R.string.TTT);
Oto komunikat o błędzie:
Błąd: nie można utworzyć statycznego odwołania do niestatycznej metody getText (int) z typu Context
Jak to się dzieje i jak mogę to rozwiązać?
java
compiler-errors
static-methods
Chen M
źródło
źródło
getString()
gdy ich potrzebujesz. W ten sposób Twoja aplikacja odpowiednio dostosuje się do użytkowników zmieniających wybrany język.Odpowiedzi:
Ponieważ
getText()
nie jest statyczny, nie można go wywołać z metody statycznej.Aby zrozumieć dlaczego, musisz zrozumieć różnicę między nimi.
Metody instancji (niestatyczne) działają na obiektach określonego typu (klasy). Są one tworzone za pomocą nowego w następujący sposób:
Aby wywołać metodę instancji, należy wywołać ją na instancji (
myObject
):Jednak statyczną metodę / pole można wywołać tylko bezpośrednio na typie, powiedzmy w ten sposób:Poprzednie stwierdzenie nie jest poprawne. Można również odwoływać się do pól statycznych z odniesieniem do obiektu,myObject.staticMethod()
ale jest to odradzane, ponieważ nie wyjaśnia, że są to zmienne klasowe.Nie mogą ze sobą współpracować, ponieważ działają w różnych przestrzeniach danych (dane instancji i dane klas)
Spróbuję to wyjaśnić. Rozważ tę klasę (psuedocode):
Teraz mam następujący przypadek użycia:
Jakie są wartości?
Dobrze
Innymi słowy,
TTT
jest to odniesienie, które jest wspólne dla wszystkich wystąpień typu. Więc nie ma sensu mówićZatem pytanie brzmi: dlaczego TTT jest statyczne lub dlaczego getText () nie jest statyczne?
Usuń
static
ten błąd i powinien minąć ten błąd - ale bez zrozumienia, co robi twój typ, to tylko przylepny plaster do następnego błędu. Jakie są wymaganiagetText()
, aby był on niestatyczny?źródło
Istnieje już kilka dobrych odpowiedzi wraz z wyjaśnieniami, dlaczego nie można zastosować mieszanki
Context
metody niestatycznejgetText()
z Twoimstatic final String
.Dobre pytanie, które warto zadać, brzmi: dlaczego chcesz to zrobić? Próbujesz załadować a
String
ze swojegostrings
zasobu i wypełnić jego wartość wpublic static
polu. Zakładam, że to jest tak, że niektóre z twoich innych klas mają do niego dostęp? Jeśli tak, nie ma takiej potrzeby. Zamiast tego przejdźContext
do innych klas i zadzwońcontext.getText(R.string.TTT)
z ich wnętrza.I zadzwonić do tego z twojego
Activity
:Umożliwi to dostęp do
String
zasobów bez konieczności korzystania zpublic static
pola.źródło
String a[] = context.getTextArray(R.array.myStringArray);
; daje mi jednak błądThe method getTextArray(int) is undefined for the type Context
- dlaczego miałby być niezdefiniowany, skoro działa z getText?Context
nie ma wywoływanej metodygetTextArray
, ale ją magetText
. Być może myślisz o tym,Resources
co magetTextArray
dla innych, którzy znajdą to w wyszukiwaniu:
Często otrzymuję ten komunikat, gdy przypadkowo wywołuję funkcję przy użyciu nazwy klasy, a nie nazwy obiektu. Zwykle dzieje się tak, ponieważ nadaję im zbyt podobne nazwy: P
to znaczy:
Jest to oczywiście metoda statyczna. (dobre dla niektórych) Ale to, co naprawdę chciałem zrobić (w większości przypadków było)
To taki głupi błąd, ale co kilka miesięcy marnuję około 30 minut na majstrowanie przy zmiennych w definicjach „MyClass”, aby dowiedzieć się, co robię źle, kiedy naprawdę, to tylko literówka.
Zabawna uwaga: przepełnienie stosu podkreśla składnię, aby błąd był tutaj naprawdę oczywisty.
źródło
Możesz ustawić zmienną jako niestatyczną
lub uczyń metodę „getText” statyczną (jeśli to w ogóle możliwe)
źródło
getText jest członkiem twojego działania, więc musi zostać wywołane, gdy istnieje „this”. Zmienna statyczna jest inicjowana, gdy klasa jest ładowana przed utworzeniem działania.
Ponieważ chcesz, aby zmienna była inicjowana z ciągu zasobów, nie może być statyczna. Jeśli chcesz, aby był statyczny, możesz zainicjować go wartością String.
źródło
Nie można odwołać się do zmiennej statycznej z metody niestatycznej. Aby to zrozumieć, musisz zrozumieć różnicę między statycznymi i niestatycznymi.
Zmienne statyczne są zmiennymi klasowymi, należą do klasy, która ma tylko jedną instancję, utworzoną tylko w pierwszej. Zmienne niestatyczne są inicjowane za każdym razem, gdy tworzysz obiekt klasy.
Przechodząc do twojego pytania, kiedy użyjesz operatora new (), utworzymy kopię każdego pola niestatycznego dla każdego obiektu, ale tak nie jest w przypadku pól statycznych. Dlatego daje błąd czasu kompilacji, jeśli odwołujesz się do zmiennej statycznej z metody niestatycznej.
źródło
To pytanie nie jest nowe, a istniejące odpowiedzi dają dobre podstawy teoretyczne. Chcę tylko dodać bardziej pragmatyczną odpowiedź.
getText jest metodą klasy abstrakcyjnej Context i aby ją wywołać, potrzebna jest instancja jej podklasy (Activity, Service, Application lub inna). Problem polega na tym, że publiczne statyczne zmienne końcowe są inicjowane przed utworzeniem jakiejkolwiek instancji Context.
Istnieje kilka sposobów rozwiązania tego problemu:
źródło