เหตุใดเราจึงไม่สามารถกำหนดเขตข้อมูลคงที่โดยอัตโนมัติในฤดูใบไม้ผลิ


98

เหตุใดเราจึงไม่สามารถกำหนดตัวแปรอินสแตนซ์แบบคงที่ใน Spring bean ได้โดยอัตโนมัติ ฉันรู้ว่ามีวิธีอื่นในการบรรลุเป้าหมายนี้ แต่แค่อยากรู้ว่าทำไมเราถึงทำไม่ได้ด้วยวิธีด้านล่างนี้

เช่น

@Autowired
public static Test test;

คุณช่วยทำลายความสว่างในวิธีอื่นที่คุณอ้างถึงได้ไหม
samshers

คุณสามารถเดินสายอัตโนมัติผ่านตัวสร้างหรือใช้ @PostConstuct
gagarwa

คำตอบ:


70

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

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


11
ข้อแม้อย่างหนึ่งที่ฉันพบคือระหว่างการทดสอบ หากคุณต้องการใช้@BeforeClassใน SpringJUnit4ClassRunner และมีวิธีการเข้าถึงถั่ว@Autowiredในการทดสอบ .. โดยพื้นฐานแล้วคุณไม่สามารถทำได้ ซึ่งน่ารำคาญ.
Jason Polites

4
คำตอบนี้อธิบายได้ว่าทำไมจึงไม่ควร "t แต่แรงจูงใจที่แท้จริงก็คือเมื่อเฟรมเวิร์กพยายามต่อสายคลาสแบบคงที่เข้ากับ bean คลาสโหลด
เดอร์

51
คำตอบนี้ไร้เหตุผลอย่างสมบูรณ์ Spring ไม่ได้กำหนดกลยุทธ์การทดสอบของคุณ คำตอบคือยังไม่มีการโหลดไลบรารี Spring เมื่อคลาสแบบคงที่ถูกสร้างอินสแตนซ์โดยตัวโหลดคลาส
Andrea T

7
คำตอบของ @AndreaT ควรเป็นคำตอบที่ยอมรับได้
Chirag Agrawal

3
วิธีการแบบคงที่นั้นทดสอบได้ง่ายกว่าไม่ยากกว่า การมีสปริงฉีดการพึ่งพาโดยอัตโนมัติดูเหมือนดี แต่นั่นเป็นเส้นทางที่ยากกว่าสำหรับการทดสอบ Mocks, Stubs และ Test doubles เป็นกลิ่นรหัสไม่ใช่วิธีการคงที่
mttdbrd

151

เนื่องจากเมื่อตัวโหลดคลาสโหลดค่าคงที่บริบท Spring จึงยังไม่จำเป็นต้องโหลด ดังนั้นตัวโหลดคลาสจะไม่ฉีดฟิลด์คงที่ใน bean อย่างถูกต้องและจะล้มเหลว


49
ขอบคุณสำหรับคำตอบที่ดูเหมือนจะตอบคำถามได้จริงแทนที่จะแสดงความเห็นว่าภาษา Java ครึ่งหนึ่งเป็นความคิดที่ไม่ดี
Warren Dew

1
"คลาสคง"?
อรุณราจ

สิ่งนี้ดูเหมือนจะไม่ถูกต้องเนื่องจาก Mockito สามารถฉีดวัตถุลงในช่องคงที่ได้คล้ายกับการเดินสายอัตโนมัติของสปริง ... แม้ว่าฉันจะไม่รู้ว่าการใช้งานเหมือนกันหรือไม่ ต้องการข้อมูลเพิ่มเติม
gagarwa

Mockito ไม่สามารถจำลองวิธีการคงที่ได้ คุณต้องใช้ Powermock เพื่อจำลองวิธีการคงที่
Jaison Varghese

17

ตามแนวคิด OOP จะเป็นการออกแบบที่ไม่ดีหากมีการกำหนดตัวแปรคงที่โดยอัตโนมัติ

ตัวแปรคงไม่ใช่คุณสมบัติของ Object แต่เป็นคุณสมบัติของ Class การเดินสายสปริงอัตโนมัติทำบนวัตถุและนั่นทำให้การออกแบบดูสะอาดตาในความคิดของฉัน คุณสามารถปรับใช้อ็อบเจ็กต์ bean แบบมีสายอัตโนมัติเป็นซิงเกิลตันและบรรลุเช่นเดียวกับการกำหนดแบบคงที่


15

ด้วยโซลูชันนี้คุณสามารถกำหนดฟิลด์คงที่โดยอัตโนมัติในฤดูใบไม้ผลิ

@Component
public class TestClass {

    private static Test test;

    @Autowired
    public void setTest(Test test) {
        TestClass.test = test;
    }
}

4
Bugfinder จะบ่นเกี่ยวกับการตั้งค่าฟิลด์แบบคงที่จากวิธีที่ไม่คงที่
Neftanic

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