“İçe aktarma” sonrasındaki “statik” değiştirici ne anlama geliyor?


438

Bu şekilde kullanıldığında:

import static com.showboy.Myclass;

public class Anotherclass{}

import static com.showboy.Myclassve arasındaki fark import com.showboy.Myclassnedir?

Yanıtlar:


390

Belgelere Bakın

Statik ithalat beyanı, normal ithalat beyanına benzer. Normal içe aktarma bildiriminin sınıfları paketlerden içe aktardığı ve paket niteliği olmadan kullanılmasına izin verdiği durumlarda, statik içe aktarma bildirimi, statik nitelikleri sınıflardan alır ve sınıf niteliği olmadan kullanılmasına izin verir.

Peki statik içe aktarmayı ne zaman kullanmalısınız? Çok tutumlu! Bunu yalnızca sabitlerin yerel kopyalarını bildirme veya mirasın (Sabit Arayüz Antipattern'i) kötüye kullanma isteğinde bulunduğunuzda kullanın. Başka bir deyişle, bir veya iki sınıftan statik üyelere sık erişmeniz gerektiğinde kullanın. Statik içe aktarma özelliğini aşırı kullanırsanız, programınızı okunamaz ve sürdürülemez hale getirerek ad alanını içe aktardığınız tüm statik üyelerle kirletebilir. Kodunuzun okuyucuları (siz de dahil, yazdıktan birkaç ay sonra), statik bir üyenin hangi sınıftan geldiğini bilmeyecektir. Tüm statik üyelerin bir sınıftan içe aktarılması, okunabilirliğe özellikle zararlı olabilir; yalnızca bir veya iki üyeye ihtiyacınız varsa, ayrı ayrı içe aktarın. Uygun şekilde kullanıldığında, statik içe aktarma programınızı daha okunabilir hale getirebilir,


28
@Xsl'nin yukarıdaki uyarılarına tamamen katılıyorum. Kesinlikle çok yararlı olduğu bir alan , tüm birim testleriniz için junit Assert: import static org.junit.Assert. * .
BxlSofty

3
- basit bir açıklama yazmak yerine, çok uzun ve gerçekten dikkat çekici olmayan belge dosyasını yapıştırma kontrolü için.
Błażej Michalik

@xsl Gönderinin alt kısmının bir alıntı bloğunda olması gerekiyor mu? yazmış gibi görünüyorsun.
Ferrybig

1
@Ferrybig: Bağlantılı belgelerden bir alıntı.
Joshua Snider

Gibi includeRuby'deki !
Chloe

227

Belirttiğiniz iki ithalat arasında hiçbir fark yoktur. Ancak, diğer sınıfların statik üyelerine niteliksiz erişime izin vermek için statik içe aktarmayı kullanabilirsiniz. Bunu yapmak zorunda olduğum yerde:

import org.apache.commons.lang.StringUtils;
      .
      .
      .
if (StringUtils.isBlank(aString)) {
      .
      .
      .

Bunu yapabilirim:

import static org.apache.commons.lang.StringUtils.isBlank;
      .
      .
      .
if (isBlank(aString)) {
      .
      .
      .

Belgelerde daha fazlasını görebilirsiniz .


57

Statik içe aktarma, sınıf yerine statik alanları / yöntemi içe aktarmak için kullanılır:

package test;

import org.example.Foo;

class A {

 B b = Foo.B_INSTANCE;

}

Yazabilirsin :

package test;

import static org.example.Foo.B_INSTANCE;

class A {

 B b = B_INSTANCE;

}

Kodunuzda genellikle başka bir sınıftan bir sabit kullanılıyorsa ve statik içe aktarma belirsiz değilse kullanışlıdır.

Btw, örneğinizde "içe aktarma statik org.example.Myclass;" çalışmaz: import sınıf, import static bir sınıfın statik üyeleri içindir.


37

Statik içe aktarmanın temel fikri, bir statik sınıf, statik bir değişken veya bir numaralandırma kullandığınızda, bunları içe aktarabileceğiniz ve kendinizi bazı yazımlardan kurtarabileceğinizdir.

Konuyu örnekle açıklayacağım.

import java.lang.Math;

class WithoutStaticImports {

 public static void main(String [] args) {
  System.out.println("round " + Math.round(1032.897));
  System.out.println("min " + Math.min(60,102));
 }
}

Statik içe aktarmalarla aynı kod:

import static java.lang.System.out;
import static java.lang.Math.*;

class WithStaticImports {
  public static void main(String [] args) {
    out.println("round " + round(1032.897));
    out.println("min " + min(60,102));
  }
}

Not : statik içe aktarma kodunuzu okumak için kafa karıştırıcı hale getirebilir.


4
import static java.lang.MathYıldız işareti olmadan yazmak bir şey ifade eder mi?
Chris Middleton

1
@AmadeusDrZaius no, import static yalnızca bir sınıfın statik üyeleri içindir.
Harry

1
İyi cevap! Birçok 'yeni' bu yazıyı okuduğu için küçük bir uyarı verilmelidir: İsim alanı kirliliğini önlemek için yıldız işaretini aşırı kullanmayın.
goerlibe

24

statik com.showboy.Myclass "ve" import com.showboy.Myclass "arasındaki fark nedir?

Statik içe aktarma yalnızca alanların veya üye türlerinin içe aktarılması için çalıştığından birincisi derleyici hatası oluşturmalıdır. (Sınıfımın bir iç sınıf veya şovmen üyesi olmadığı varsayılarak)

Bence demek istedin

import static com.showboy.MyClass.*;

Bu, MyClass'taki tüm statik alanları ve üyeleri, onları nitelemek zorunda kalmadan gerçek derleme biriminde kullanılabilir hale getirir ... yukarıda açıklandığı gibi


14

importPaket yeterlilik olmadan bir paketin erişim sınıflarına java programcısı sağlar.

Bu static importözellik, sınıf kalifikasyonu olmadan bir sınıfın statik üyelerine erişmenizi sağlar.

importSınıflara ulaşmak sadece ve arayüz oysa static importsınıfın statik üyelerine yakınınızda.

Misal :

ile ithalat

import java.lang.System.*;    
class StaticImportExample{  
    public static void main(String args[]){  

       System.out.println("Hello");
       System.out.println("Java");  

  }   
} 

İle statik ithalat

import static java.lang.System.*;    
class StaticImportExample{  
  public static void main(String args[]){  

   out.println("Hello");//Now no need of System.out  
   out.println("Java");  

 }   
} 

Ayrıca bkz: Java 5'te statik içe aktarma nedir


2

Diyelim ki bir sınıfın MyClassiçinde denilen paketin içinde denilen statik alanlar ve yöntemler var myPackageve her seferinde yazarak myStaticFieldveya yazmadan bunlara doğrudan erişmek istiyorsunuz veyamyStaticMethodMyClass.myStaticFieldMyClass.myStaticMethod .

Not: Diğer kaynaklara erişmek için import myPackage.MyClass veyamyPackage.*


1

staticSonra değiştirici import/ alınırken bir sınıfın statik alanlar kullanarak içindir. Kullandığım bir alan import static, bir sınıftan sabitleri almak içindir. import staticStatik yöntemlere de başvurabiliriz . Yazdığınızdan emin olun import staticçünkü static importyanlış.

static importJava nedir - JavaRevisited - Hakkında daha fazla bilgi edinmek için çok iyi bir kaynakimport static.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.