web-gelistirme-sc.com

tam olarak ne zaman "public static final String" kullanmalıyız?

İnsanların public static final String mystring = ... Yazdığı çok kod gördüm ve sonra sadece bir değer kullanın.

Bunu neden yapmak zorundalar? Neden kullanmadan önce değeri final olarak başlatmak zorundalar?

GÜNCELLEME

Tamam, tüm cevaplarınız için teşekkürler, bu anahtarın anlamını anlıyorum (genel statik final). Anlamadığım şey, insanların neden sadece tek bir yerde ve sadece aynı sınıfta kullanılsalar bile bunu kullandıkları. neden ilan ettin? neden sadece değişkeni kullanmıyoruz? 

39
storm_buster

final, değişkenin değerinin değişmeyeceğini gösterir - başka bir deyişle, değeri ilan edildikten sonra değiştirilemeyen bir değişken.

Bir String oluşturmak istediğinizde public final static String kullanın:

  1. sınıfa aittir (static: kullanmak için gerekli örnek yok), ve
  2. değişmeyecek (final), örneğin sınıfın tüm örneklerinde ve sınıfı kullanan diğer nesnelerde bulunabilecek bir String sabiti tanımlamak istediğinizde.

Örnek:

public final static String MY_CONSTANT = "SomeValue";

// ... in some other code, possibly in another object, use the constant:
if (input.equals(MyClass.MY_CONSTANT)

Benzer şekilde:

public static final int ERROR_CODE = 127;

final kullanmak zorunlu değildir, ancak programın çalışması sırasında istemeden değiştirilmekten bir sabittir ve değişkenin sabit olduğunu gösteren bir gösterge olarak işlev görür.

Sabit, yalnızca geçerli sınıfta ve/veya yalnızca tek bir yerde - okunacak - olsa bile, tüm sabitleri final olarak bildirmek iyi bir uygulamadır: daha açıktır ve kodun ömrü boyunca sabit kullanılamaz. birden fazla yerde.

Ayrıca, final kullanmak uygulamanın bazı optimizasyonlar yapmasına izin verebilir, örn. sabitin kullanıldığı gerçek bir değeri satırlayarak. 

67
pb2q
  1. Statik demektir .. Sınıfı başlatmadan ya da herhangi bir nesneyi kullanmadan kullanabilirsiniz.
  2. final..It dizgiyi sabit yapmak için kullanılan bir anahtar kelimedir. Bu dizenin değerini değiştiremezsiniz. Aşağıdaki örneğe bakın:

      public class StringTest { 
               static final String str = "Hello"; 
      public static void main(String args[]) { 
               // str = "world"; // gives error 
               System.out.println(str); // called without the help of an object                       
               System.out.println(StringTest.str);// called with class name  
                 } 
             } 
    

Teşekkürler

9

final anahtar sözcüğü, değerin sabit olduğu anlamına gelir (değiştirilemez). C'deki const ile benzerdir.

Ve statik 'yi kapsamı olan global bir değişken olarak ele alabilirsiniz. Temel olarak, eğer bir nesne için değiştirirseniz, bunun genel bir değişken gibi (kapsam ile sınırlı) herkes için değişeceği anlamına gelir.

Umarım yardımcı olur.

4
Fyre

final, ayarlandıktan sonra değerin değiştirilemediğini gösterir. static, değeri ayarlamanıza izin verir ve bu değer, onu kullanan sınıfın ALL örnekleri için aynı olacaktır. Ayrıca, bir sınıf örneğine sahip olmayan bir public static dizesinin değerine erişebilirsiniz.

2
Madbreaks

static, nesnenin yalnızca bir kez yaratılacağı ve onu içeren bir örnek nesnesinin olmadığı anlamına gelir. Yazma şekliniz, sınıftaki tüm nesneler için ortak olan ve asla değişmeyecek bir şeye sahip olduğunuzda en iyi şekilde kullanılır. Hiç bir nesne oluşturmadan bile kullanılabilir.

Derleyicinin bu kuralı uygulayabilmesi için kesin olarak kullanmanız gerektiğinden final olmasını beklediğinizde genellikle final kullanmaktır. static, tüm nesneler için aynı değer olacaksa, aynı şeyin çoğunu yaratarak belleği boşa harcamamanızı sağlar.

2
Carl

Genellikle sabitleri tanımlamak için, birçok yerde tekrar kullanmanız, onu tek bir sınıfta kullanılan veya paketler arasında paylaşılan değişiklik için tek nokta haline getirir. Değişken bir final yapmak, yanlışlıkla yapılan değişiklikleri önler.

1
devang

public , diğer sınıflar arasında erişilebilir olmasını sağlar. Sınıfın örneğini oluşturmadan veya herhangi bir nesneyi kullanmadan kullanabilirsiniz.

Static statik , tüm sınıf örneklerinde üniform bir değer yapar .Tüm nesneler için aynı değer olacaksa, aynı şeyi çoğaltarak bellek harcamamanızı sağlar.

final değiştirilemez bir değer yapar. Tüm sınıf örneklerinde aynı olan ve değiştirilemeyen bir "sabit" değerdir.

1
Nikhil Kotak

Standart/en iyi uygulama türüdür .. __ Senaryoları listeleyen cevaplar zaten var, ancak ikinci sorunuz için:

Bunu neden yapmak zorundalar? Neden kullanmadan önce değeri nihai olarak başlatmak zorundalar?

Beyanda başlatılan kamu sabitleri ve alanları sadece "final" yerine "statik final" olmalıdır.

Bunlar, bunun böyle olmasının sebeplerinden bazıları:

  1. Statik finalin aksine, bir finali sabit yapmak, sınıfın her bir örneği için değerinin çoğaltılmasına yol açar, işe yaramaz bir şekilde uygulamayı uygulamak için gereken bellek miktarını arttırır.

  2. Ayrıca, halka açık olmayan, son bir alan da statik olmadığında, farklı örneklerin farklı değerlere sahip olabileceği anlamına gelir. Bununla birlikte, bildirgesinde statik olmayan bir son alanın başlatılması, her örneği son alanın davranışı nedeniyle aynı değere sahip olmaya zorlar.

0
KumarAnkit

public, diğer sınıflar arasında erişilebilir olmasını sağlar. static onu tüm sınıf örnekleri boyunca aynı değerde yapar. final onu değiştirilemez bir değer yapar. Yani temelde, tüm sınıf örneklerinde aynı olan ve değiştirilemeyen bir "sabit" değeridir. Endişenizle ilgili olarak "Anlayamadığım şey, insanların sadece tek bir yerde ve aynı sınıfta kullanılmasına rağmen neden bunu kullandıklarıdır. Neden beyan ediyoruz? Neden sadece değişkeni kullanmıyoruz?" Genel bir alan olduğu için sabit değer ClassName.value kullanılarak başka bir sınıfın başka bir yerinde de kullanılabileceğini söyleyebilirim. örneğin: Math isimli bir sınıf, Math.PI olarak erişilebilen son statik uzun değer olarak PI olabilir.

0
Sachin Tiwari

İnsanlar neden değişkenler yerine sınıflarda sabitler kullanıyor?

okunabilirlik ve bakım kolaylığı, 

kodunuzda 40.023 gibi bir sayıya sahip olmak, numaranın neyi temsil ettiği hakkında pek bir şey söylemez, bu yüzden "USER_AGE_YEARS" gibi başkentlerdeki bir Word ile değiştiririz. Daha sonra koda baktığımızda bu sayının neyi temsil ettiği netleşir. 

Neden sadece bir değişken kullanmıyoruz? Sayının değişeceğini bilseydik iyi olur, ama eğer değişmeyecek bir sayı olursa, 3.14159 gibi ... kesinleşiriz.

Peki ya bir String gibi bir sayı değilse? Bu durumda, çoğunlukla korunabilirlik için, kodunuzda birden çok kez bir String kullanıyorsanız (ve çalışma zamanında değişmeyecektir), sınıfın tepesinde son bir dize olarak olması uygundur. Bu şekilde değiştirmek istediğinizde, onu değiştirmek yerine, değiştirecek tek bir yer var. 

Örneğin, kodunuzda birçok kez yazdırılan bir hata iletiniz varsa, son dize olan ERROR_MESSAGE = "Bir şeyler ters gitti." "Bir şeyler ters gitti" den değiştirmek istiyorsanız, bakımı daha kolaydır. "Çoktan jim zaten ölmüş" ifadesiyle, bu yorumu kullanacağınız tüm yerler yerine, yalnızca bir satırını değiştirmeniz gerekir.

0
kiwicomb123

_ final kullanmak zorunda değilsiniz, ancak final herkese açıklık kazandırıyor - derleyici de dahil - bu bir sabittir ve bu iyi uygulamadır.

Neden insanlar bunu yapıyorlar sabit sadece bir yerde ve sadece aynı sınıfta kullanılacaksa bile : Çünkü çoğu durumda hala mantıklı geliyor. Örneğin, program çalışması sırasında kesin olacağını biliyorsanız, ancak değeri daha sonra değiştirmeyi ve yeniden derlemeyi (bulmayı daha kolay) ve ayrıca daha sonra da daha sık kullanabileceğinizi düşünüyorsanız. Ayrıca, diğer programcıları belirgin ve birleştirilmiş bir yerde program akışındaki ana değerler hakkında bilgilendirmektedir.

Diğer cevapların maalesef eksik olduğu bir yön, public final kombinasyonunun kullanılmasının yapılması gerektiği çok dikkatli, özellikle de diğer sınıflar veya paketler sınıfınızı kullanacaksa (ki kabul edilebilir) çünkü public).

İşte nedeni:

  1. final olarak bildirildiği için, derleyici derleme süresi boyunca bu alanı okuyan herhangi bir derleme birimine bu satırı dahil eder. Çok uzak çok iyi.
  2. İnsanların unutacağı şey, alanın da public olarak bildirildiği için, derleyici bu değeri başka bir derleme birimine de ekleyecektir. Bu, bu alanı kullanan diğer sınıfları ifade eder.

Sonuçları nelerdir?

Hayal ettiğini düşün:

class Foo {
  public static final String VERSION = "1.0";
}

class Bar {
  public static void main(String[] args) {
    System.out.println("I am using version " + Foo.VERSION);
  }
}

Bar'i derleyip çalıştırdıktan sonra, şunları elde edersiniz:

I am using version 1.0

Şimdi, Foo değerini geliştiriyor ve sürümü "1.1" olarak değiştiriyorsunuz. Foo öğesini yeniden derledikten sonra, Bar komutunu çalıştırıp bu yanlış çıktıyı alırsınız:

I am using version 1.0

Bunun nedeni, VERSION, final olarak bildirildiği için, bu nedenle, gerçek derleme değeri, ilk derleme çalışması sırasında zaten Bar içinde sıralanmıştır. Sonuç olarak, bir public static final ... alanı örneğinin gerçekten ilan edilmiş olanı değiştirdikten sonra doğru şekilde yayılmasını sağlamak için final (yalan söyledin !;), yapmanız gerekenler kullanarak her sınıfı yeniden derleyin .

Bunu birkaç kez gördüm ve hata ayıklamak gerçekten zor.

final ile, programınızın sonraki sürümlerinde değişebilecek değişmez anlamına gelirse, daha iyi bir çözüm şöyle olacaktır:

class Foo {
  private static String version = "1.0";
  public static final String getVersion() {
    return version;
  }
}

Bunun performans cezası ihmal edilebilir, çünkü JIT kod üreteci çalışma zamanında onu satır içine alacaktır.

0
nico gawenda