Bir Değişkenin Yeniden Atanmasını Durdurma
Bu cevaplar entelektüel olarak ilginç olsa da, kısa basit cevabı okumadım:
Derleyicinin bir değişkenin farklı bir nesneye yeniden atanmasını önlemek istediğinizde final anahtar sözcüğünü kullanın .
Değişken statik bir değişken, üye değişken, yerel değişken veya bağımsız değişken / parametre değişkeni olsun, efekt tamamen aynıdır.
Misal
Etkisini eylemde görelim.
İki değişkenin ( arg ve x ) her ikisine de farklı nesneler atanabildiği bu basit yöntemi düşünün .
// Example use of this method:
// this.doSomething( "tiger" );
void doSomething( String arg ) {
String x = arg; // Both variables now point to the same String object.
x = "elephant"; // This variable now points to a different String object.
arg = "giraffe"; // Ditto. Now neither variable points to the original passed String.
}
Yerel değişkeni son olarak işaretleyin . Bu derleyici hatasıyla sonuçlanır.
void doSomething( String arg ) {
final String x = arg; // Mark variable as 'final'.
x = "elephant"; // Compiler error: The final local variable x cannot be assigned.
arg = "giraffe";
}
Bunun yerine, parametre değişkenini final olarak işaretleyelim . Bu da derleyici hatasıyla sonuçlanır.
void doSomething( final String arg ) { // Mark argument as 'final'.
String x = arg;
x = "elephant";
arg = "giraffe"; // Compiler error: The passed argument variable arg cannot be re-assigned to another object.
}
Hikayeden çıkarılacak ders:
Bir değişkenin her zaman aynı nesneyi gösterdiğinden emin olmak istiyorsanız, son değişkeni işaretleyin .
Asla Bağımsız Değişkenleri Yeniden Atama
İyi programlama pratiği olarak (herhangi bir dilde), çağıran yöntem tarafından iletilen nesneden başka bir nesneye hiçbir zaman parametre / argüman değişkeni atamamalısınız. Yukarıdaki örneklerde, asla satır yazılmamalıdır arg =
. İnsanlar hata yaptığı ve programcılar insan olduğu için derleyiciden bize yardım etmesini isteyelim. Her parametre / bağımsız değişken değişkenini 'son' olarak işaretleyin, böylece derleyici bu tür yeniden atamaları bulabilir ve işaretleyebilir.
Geçmişe bakıldığında
Diğer cevaplarda belirtildiği gibi ... Java'nın programcılara bir dizinin sonunu okumak gibi aptalca hatalardan kaçınmasına yardımcı olan özgün tasarım hedefi göz önüne alındığında, Java tüm parametre / argüman değişkenlerini otomatik olarak 'nihai' olarak uygulamak için tasarlanmış olmalıdır. Başka bir deyişle, Bağımsız Değişkenler değişken olmamalıdır . Ancak gezinin 20/20 vizyonu var ve Java tasarımcıları o zamanlar ellerini doluydu.
Yani, her zaman final
tüm argümanlara eklensin mi?
final
Bildirilen her bir metod parametresine eklememiz gerekir mi?
- Teorik olarak, evet.
- Uygulamada, hayır.
Only final
Yalnızca yöntemin kodu uzun veya karmaşıksa, bağımsız değişkenin yerel veya üye bir değişkenle karıştırılabileceği ve muhtemelen yeniden atanabileceği durumlarda ekleyin .
Asla bir argümanı yeniden atama pratiği satın alırsanız, final
her birine bir tane eklemeye meyilli olacaksınız . Ancak bu sıkıcı ve bildirimin okunmasını biraz zorlaştırıyor.
Bağımsız değişken açıkçası bir bağımsız değişken olduğu ve basit bir değişken veya bir üye değişkeni kısa kısa kod için, ben ekleme zahmet etmeyin final
. Kod oldukça açıksa, ne şansım ne de başka bir programcı, argüman değişkenini yanlışlıkla bir argümandan başka bir şey olarak yanlış bir şekilde bozan bakım veya yeniden düzenleme yapmazsa, rahatsız etmeyin. Kendi çalışmamda, final
yalnızca bir argümanın yerel veya üye değişkenle karıştırılabileceği daha uzun veya daha fazla ilgili kod ekliyorum .
Bütünlük için bir vaka daha eklendi
public class MyClass {
private int x;
//getters and setters
}
void doSomething( final MyClass arg ) { // Mark argument as 'final'.
arg = new MyClass(); // Compiler error: The passed argument variable arg cannot be re-assigned to another object.
arg.setX(20); // allowed
// We can re-assign properties of argument which is marked as final
}