Membangun aplikasi multi-bahasa di Java. Mendapatkan kesalahan saat memasukkan nilai String dari R.string
file XML sumber daya:
public static final String TTT = (String) getText(R.string.TTT);
Ini adalah pesan kesalahannya:
Kesalahan: Tidak dapat membuat referensi statis ke metode non-statis getText (int) dari tipe Konteks
Bagaimana ini disebabkan dan bagaimana saya bisa mengatasinya?
java
compiler-errors
static-methods
Chen M
sumber
sumber
getString()
saat Anda membutuhkannya. Dengan begitu, aplikasi Anda menyesuaikan dengan baik pengguna yang mengubah bahasa pilihan mereka.Jawaban:
Karena
getText()
non-statis Anda tidak dapat memanggilnya dari metode statis.Untuk memahami alasannya, Anda harus memahami perbedaan di antara keduanya.
Metode contoh (non-statis) bekerja pada objek yang berjenis tertentu (kelas). Ini dibuat dengan yang baru seperti ini:
Untuk memanggil metode instance, Anda memanggilnya di instance (
myObject
):Namun metode / field statis hanya dapat dipanggil pada tipe secara langsung, katakan seperti ini:Pernyataan sebelumnya tidak benar. Anda juga dapat merujuk ke bidang statis dengan referensi objek sepertimyObject.staticMethod()
tetapi hal ini tidak disarankan karena tidak menjelaskan bahwa mereka adalah variabel kelas.Dan keduanya tidak dapat bekerja sama karena beroperasi pada ruang data yang berbeda (data contoh dan data kelas)
Biar saya coba dan jelaskan. Pertimbangkan kelas ini (psuedocode):
Sekarang saya memiliki kasus penggunaan berikut:
Apa nilainya?
Baik
Dengan kata lain,
TTT
adalah datum yang dibagikan oleh semua instance tipe. Jadi tidak masuk akal untuk mengatakannyaJadi pertanyaannya adalah mengapa TTT statis atau mengapa getText () tidak statis?
Hapus
static
dan itu harus melewati kesalahan ini - tetapi tanpa memahami apa jenis Anda lakukan itu hanya plester yang menempel sampai kesalahan berikutnya. Apa persyaratangetText()
yang mengharuskannya menjadi non-statis?sumber
Ada beberapa jawaban yang baik sudah dengan penjelasan mengapa campuran non-statis
Context
metodegetText()
tidak dapat digunakan dengan Andastatic final String
.Pertanyaan yang bagus untuk ditanyakan adalah: mengapa Anda ingin melakukan ini? Anda mencoba memuat
String
daristrings
sumber daya Anda , dan mengisi nilainya ke dalampublic static
bidang. Saya berasumsi bahwa ini agar beberapa kelas Anda yang lain dapat mengaksesnya? Jika demikian, tidak perlu melakukan ini. Alih-alih berikan aContext
ke kelas Anda yang lain dan panggilcontext.getText(R.string.TTT)
dari dalam mereka.Dan untuk memanggil ini dari Anda
Activity
:Ini akan memungkinkan Anda untuk mengakses
String
sumber daya Anda tanpa perlu menggunakanpublic static
bidang.sumber
String a[] = context.getTextArray(R.array.myStringArray);
; itu, bagaimanapun, memberi saya kesalahanThe method getTextArray(int) is undefined for the type Context
- mengapa itu tidak terdefinisi sementara itu bekerja dengan getText?Context
tidak memiliki metode yang dipanggilgetTextArray
, tetapi memilikigetText
. Mungkin Anda berpikir tentangResources
mana yang memilikigetTextArray
untuk orang lain yang menemukan ini dalam pencarian:
Saya sering mendapatkan yang ini ketika saya tidak sengaja memanggil fungsi menggunakan nama kelas daripada nama objek. Ini biasanya terjadi karena saya memberi mereka nama yang terlalu mirip: P.
yaitu:
Ini jelas merupakan metode statis. (baik untuk sesuatu) Tapi yang benar-benar ingin saya lakukan (dalam banyak kasus adalah)
Ini adalah kesalahan yang konyol, tetapi setiap beberapa bulan, saya membuang waktu sekitar 30 menit untuk mengotak-atik vars dalam definisi "MyClass" untuk mengetahui apa yang saya lakukan salah padahal sebenarnya, itu hanya salah ketik.
Catatan lucu: stack overflow menyoroti sintaks untuk membuat kesalahan sangat jelas di sini.
sumber
Anda dapat membuat variabel Anda tidak statis
atau jadikan metode "getText" statis (jika memungkinkan)
sumber
getText adalah anggota Aktivitas Anda sehingga harus dipanggil jika "ini" ada. Variabel statis Anda diinisialisasi ketika kelas Anda dimuat sebelum Aktivitas Anda dibuat.
Karena Anda ingin variabel diinisialisasi dari string Sumber Daya maka itu tidak bisa statis. Jika Anda ingin menjadi statis Anda dapat menginisialisasi dengan nilai String.
sumber
Anda tidak dapat membuat referensi ke variabel statis dari metode non-statis. Untuk memahami ini, Anda perlu memahami perbedaan antara statis dan non-statis.
Variabel statis adalah variabel kelas, mereka termasuk dalam kelas dengan satu-satunya contoh, dibuat hanya pada yang pertama. Variabel non-statis diinisialisasi setiap kali Anda membuat objek kelas.
Sekarang datang ke pertanyaan Anda, ketika Anda menggunakan operator new () kami akan membuat salinan dari setiap file non-statis untuk setiap objek, tetapi tidak untuk bidang statis. Itulah mengapa ini memberikan kesalahan waktu kompilasi jika Anda mereferensikan variabel statis dari metode non-statis.
sumber
Pertanyaan ini bukanlah pertanyaan baru dan jawaban yang sudah ada memberikan beberapa latar belakang teoritis yang baik. Saya hanya ingin menambahkan jawaban yang lebih pragmatis.
getText adalah metode kelas abstrak Konteks dan untuk memanggilnya, seseorang memerlukan turunan dari subkelasnya (Aktivitas, Layanan, Aplikasi, atau lainnya). Masalahnya adalah, variabel final statis publik diinisialisasi sebelum instance Konteks dibuat.
Ada beberapa cara untuk mengatasinya:
sumber