Saya bertanya-tanya apakah saya menggunakan metode yang benar untuk memanggil sesuatu di utas yang berbeda. Saya melakukannya di Android, tetapi menurut saya itu adalah pertanyaan umum Java.
Saya punya metode dengan beberapa parameter. Katakanlah mereka int.
class Main1 {
public static void mainOnlyWork(int x, int y) {
// not important here.
}
}
class Test {
Handler mHandler;
// called from main thread, stored as reference.
public Test() {
mHandler = new Handler();
}
public static void callInMainThread(final int x, final int y) {
mHandler.post(new Runnable() {
public void run() {
Main1.mainOnlyWork(x, y);
}
});
}
Sekarang pertanyaan saya adalah, apakah aman menggunakan int final untuk membuat runnable anonim tanpa anggota kelas? Jika saya menghilangkan kata kunci terakhir untuk parameter x dan y, Eclipse akan mengeluh. Menurut saya, hal itu dimaksudkan untuk hanya menggunakan bilangan konstan dalam kasus seperti itu. Jika saya tidak meneruskan konstanta, apakah tidak masalah? Apakah Java "membuatnya" konstan dengan meneruskan ke fungsi ini?
Tapi saya ingin memanggil Test.callInMainThread dari asli menggunakan JNI. Menurut pendapat saya, tidak ada cara Java mengetahui apakah angka-angka itu konstan atau tidak. Bisakah saya mempercayai Java untuk menghasilkan keajaiban? Apakah akan selalu seperti ini?
Saya pikir mungkin saya harus membuat kelas proxy, seperti:
private abstract RunnableXY implements Runnable {
public RunnableXY(int x, int y) {
this.x = x;
this.y = y;
}
public int x;
public int y;
public abstract void run();
}
Dan metode panggilan akan menggunakan:
public static void callInMainThread(final int x, final int y) {
mHandler.post(new RunnableXY(x,y) {
public void run() {
Main1.mainOnlyWork(this.x, this.y);
}
});
}
Dengan cara ini, saya melindungi nilai-nilai dari pengumpulan sampah sampai runnable digunakan dan dibuang. Apakah saya harus membuat pembungkus, atau apakah menandai x terakhir dalam parameter metode aman? Saat saya mencobanya, kata kunci final berfungsi dengan baik. Namun di thread, menurut saya jika ini berfungsi sekarang maka itu akan selalu berfungsi dengan baik. Apakah ini selalu berhasil dengan final? Bagaimana cara pembuatannya jika memang demikian? Apakah akan ada perbedaan jika parameternya bukan tipe primitif, melainkan Objek?
Pembaruan: Saya sudah mengerti apa arti final di Jawa. Itu bukanlah hal yang perlu dipertanyakan. Pertanyaannya adalah di mana ruang lingkup variabel yang digunakan dalam pembuatan Runnable. Mereka adalah penduduk lokal, artinya setelah fungsi berakhir, nilainya tidak dapat direferensikan. Di mana nilai-nilai itu disimpan, ketika objek Runnable diteruskan ke thread lain dan menunggu untuk dieksekusi?