ตัวดัดแปลง“ คงที่” หลังจาก“ นำเข้า” หมายถึงอะไร


438

เมื่อใช้แบบนี้:

import static com.showboy.Myclass;

public class Anotherclass{}

ความแตกต่างระหว่างimport static com.showboy.Myclassและimport com.showboy.Myclassคืออะไร

คำตอบ:


390

ดูเอกสารประกอบ

การประกาศการนำเข้าแบบคงที่นั้นคล้ายคลึงกับการประกาศการนำเข้าแบบปกติ ในกรณีที่การประกาศการนำเข้าแบบปกตินำเข้าคลาสจากแพ็กเกจอนุญาตให้ใช้โดยไม่มีการรับรองแพ็กเกจการประกาศการนำเข้าแบบสแตติกนำเข้าสมาชิกแบบสแตติกจากคลาสซึ่งอนุญาตให้ใช้แบบไม่มีคลาสการรับรอง

ดังนั้นเมื่อใดที่คุณควรใช้การนำเข้าแบบคงที่ เท่าที่จำเป็นมาก! ใช้งานได้ก็ต่อเมื่อคุณถูกล่อลวงให้ประกาศสำเนาของค่าคงที่ในท้องถิ่นหรือเพื่อใช้ในการละเมิดมรดก (Antipattern Interface แบบคงที่) กล่าวอีกนัยหนึ่งใช้เมื่อคุณต้องการเข้าถึงสมาชิกแบบสแตติกจากคลาสหนึ่งหรือสองบ่อยครั้ง หากคุณใช้คุณลักษณะการนำเข้าแบบคงที่มากเกินไปก็สามารถทำให้โปรแกรมของคุณไม่สามารถอ่านได้และไม่สามารถทำลายได้ทำให้เกิดเนมสเปซกับสมาชิกแบบคงที่ทั้งหมดที่คุณนำเข้า ผู้อ่านรหัสของคุณ (รวมถึงคุณไม่กี่เดือนหลังจากที่คุณเขียนมัน) จะไม่ทราบว่าสมาชิกแบบคงที่ซึ่งมาจากชั้นเรียน การนำเข้าสมาชิกแบบสแตติกทั้งหมดจากคลาสอาจเป็นอันตรายอย่างยิ่งต่อการอ่านได้ หากคุณต้องการสมาชิกเพียงหนึ่งหรือสองคนให้นำเข้าทีละรายการ ใช้อย่างเหมาะสมการนำเข้าแบบคงที่สามารถทำให้โปรแกรมของคุณอ่านง่ายขึ้น


28
ฉันเห็นด้วยอย่างสมบูรณ์กับคำเตือนข้างต้นโดย @xsl พื้นที่หนึ่งที่มีประโยชน์มากแน่นอนสำหรับ Assert ของ junit: import static org.junit.Assert. *สำหรับการทดสอบหน่วยทั้งหมดของคุณ
BxlSofty

3
- สำหรับการควบคุมการวางไฟล์เอกสารที่ยาวและไม่สะดุดตาจริงๆแทนที่จะเขียนคำอธิบายง่ายๆ
Błażej Michalik

@xsl ส่วนล่างของโพสต์ควรอยู่ในบล็อกคำพูดหรือไม่? ดูเหมือนว่าคุณพิมพ์
Ferrybig

1
@Ferrybig: มันเป็นคำพูดจากเอกสารที่เชื่อมโยง
Joshua Snider

มันเหมือนincludeทับทิม!
Chloe

227

ไม่มีความแตกต่างระหว่างการนำเข้าทั้งสองที่คุณระบุ อย่างไรก็ตามคุณสามารถใช้การอิมพอร์ตแบบสแตติกเพื่ออนุญาตการเข้าถึงสมาชิกแบบสแตติกของคลาสอื่นอย่างไม่มีเงื่อนไข ที่ฉันเคยต้องทำสิ่งนี้:

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

ฉันสามารถทำสิ่งนี้:

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

ท่านสามารถดูรายละเอียดเพิ่มเติมในเอกสาร


57

การนำเข้าคงที่ใช้ในการนำเข้าสาขา / วิธีคงที่ของชั้นเรียนแทน:

package test;

import org.example.Foo;

class A {

 B b = Foo.B_INSTANCE;

}

คุณสามารถเขียน :

package test;

import static org.example.Foo.B_INSTANCE;

class A {

 B b = B_INSTANCE;

}

มันจะมีประโยชน์ถ้าคุณมักจะใช้ค่าคงที่จากคลาสอื่นในรหัสของคุณและหากการนำเข้าคงที่ไม่ชัดเจน

Btw ในตัวอย่างของคุณ "import static.example.Myclass;" จะไม่ทำงาน: การนำเข้ามีไว้สำหรับคลาสและนำเข้าแบบคงที่สำหรับสมาชิกแบบคงที่ของคลาส


37

แนวคิดพื้นฐานของการนำเข้าแบบสแตติกคือเมื่อใดก็ตามที่คุณใช้คลาสสแตติกตัวแปรแบบคงที่หรือแบบ enum คุณสามารถนำเข้าและบันทึกตัวเองจากการพิมพ์บางอย่าง

ฉันจะอธิบายประเด็นของฉันอย่างละเอียดด้วยตัวอย่าง

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));
 }
}

รหัสเดียวกันกับการนำเข้าคงที่:

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));
  }
}

หมายเหตุ : การนำเข้าแบบคงที่อาจทำให้โค้ดของคุณสับสนในการอ่าน


4
มันจะมีความหมายอะไรที่จะเขียนimport static java.lang.Mathโดยไม่มีเครื่องหมายดอกจันหรือไม่?
Chris Middleton

1
@AmadeusDrZaius ไม่นำเข้าคงที่สำหรับสมาชิกคงที่ของคลาส
Harry

1
คำตอบที่ดี! เนื่องจาก 'มือใหม่' หลายคนอ่านโพสต์นี้หนึ่งควรให้คำเตือนเล็กน้อย: อย่าใช้เครื่องหมายดอกจันมากเกินไปเพื่อป้องกันมลพิษเนมสเปซ
goerlibe

24

ความแตกต่างระหว่าง "import static com.showboy.Myclass" และ "import com.showboy.Myclass"?

ข้อแรกควรสร้างข้อผิดพลาดของคอมไพเลอร์เนื่องจากการอิมพอร์ตแบบสแตติกทำงานกับการอิมพอร์ตฟิลด์หรือชนิดสมาชิกเท่านั้น (สมมติว่า MyClass ไม่ใช่ชั้นในหรือสมาชิกจาก showboy)

ฉันคิดว่าคุณหมายถึง

import static com.showboy.MyClass.*;

ซึ่งทำให้ฟิลด์แบบสแตติกและสมาชิกทั้งหมดจาก MyClass พร้อมใช้งานในหน่วยการคอมไพล์จริงโดยไม่ต้องผ่านการรับรอง ... ดังอธิบายข้างต้น


14

importช่วยให้โปรแกรมเมอร์ java ในการเรียนการเข้าถึงของแพคเกจที่ไม่มีวุฒิการศึกษาแพคเกจ

static importคุณสมบัติช่วยให้การเข้าถึงสมาชิกคงที่ของระดับที่ไม่มีวุฒิการศึกษาชั้นเรียน

การimportให้การเข้าถึงคลาสและส่วนติดต่อในขณะที่static importให้การเข้าถึงสมาชิกแบบคงที่ของคลาส

ตัวอย่าง:

ด้วยการนำเข้า

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

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

  }   
} 

ด้วยการนำเข้าคงที่

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");  

 }   
} 

ดูเพิ่มเติม: การนำเข้าแบบคงที่ใน Java 5 คืออะไร


2

สมมติว่าคุณมีเขตข้อมูลแบบคงที่และวิธีการภายในชั้นเรียกว่าMyClassภายในแพคเกจที่เรียกว่าmyPackageและคุณต้องการที่จะเข้าถึงได้โดยตรงโดยการพิมพ์ myStaticFieldหรือmyStaticMethodโดยไม่ต้องพิมพ์ในแต่ละครั้งหรือMyClass.myStaticFieldMyClass.myStaticMethod

หมายเหตุ: คุณต้องทำ import myPackage.MyClass หรือmyPackage.* เพื่อเข้าถึงทรัพยากรอื่น ๆ


1

โมดิstaticฟายเออร์หลังจากimportนั้นใช้สำหรับดึง / ใช้ฟิลด์สแตติกของคลาส พื้นที่หนึ่งที่ฉันใช้import staticสำหรับดึงค่าคงที่จากคลาส นอกจากนี้เรายังสามารถใช้import staticวิธีคงที่ ตรวจสอบให้แน่ใจว่าพิมพ์import staticเพราะstatic importไม่ถูกต้อง

อะไรคือสิ่งที่static importอยู่ในชวา - JavaRevisited - import staticทรัพยากรที่ดีมากที่จะรู้เพิ่มเติมเกี่ยวกับ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.