ระงับคำเตือนการนำเข้าที่เลิกใช้แล้วใน Java


112

ใน Java หากคุณนำเข้าคลาสที่เลิกใช้แล้ว:

import SomeDeprecatedClass;

คุณได้รับคำเตือนนี้: The type SomeDeprecatedClass is deprecated

มีวิธีระงับคำเตือนนี้หรือไม่?


4
ใช่ว่าจะเหมาะ แต่ในกรณีนี้ฉันใช้ไลบรารีสำหรับ Hadoop ที่ใช้ส่วนหนึ่งของ API ที่เพิ่งเลิกใช้งานดังนั้นฉันจึงไม่มีทางเลือกถ้าฉันต้องการใช้ไลบรารีนี้ นอกจากนี้ยังเป็นเพียงโครงการของโรงเรียนเท่านั้นไม่ใช่สิ่งที่จะต้องดูแล
Ed Mazur

คำตอบ:


129

ใช้คำอธิบายประกอบนี้ในชั้นเรียนหรือวิธีการของคุณ:

@SuppressWarnings( "deprecation" )

29
สิ่งนี้ใช้ได้กับการนำเข้าหรือไม่ ฉันเคยใช้คำอธิบายประกอบเกี่ยวกับวิธีการและวิธีการดังกล่าว แต่ดูเหมือนจะไม่ได้รับการยอมรับจากการนำเข้า
Ed Mazur

2
การใช้คำอธิบายประกอบในระดับชั้นเรียนควรครอบคลุมการนำเข้าด้วย มันทำสิ่งนี้อย่างน้อยภายใน Eclipse (เช่นกัน Rational Application Developer) สำหรับฉัน แต่ฉันไม่แน่ใจเกี่ยวกับระหว่างการคอมไพล์บรรทัดคำสั่ง
Craigforster

20
ดูเหมือนจะใช้ไม่ได้กับบรรทัดคำสั่ง "javac" หรืองาน <javac> ของมด ไม่แฟล็ก -Xlint: -deprecation ดูเหมือนว่ามีข้อบกพร่องของ javac
Archie

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

16
คำตอบไม่ควรอยู่ที่ด้านบนเนื่องจากคำถามเกี่ยวกับคำสั่ง "import" และการแก้ไขจะใช้ได้กับ Eclipse / Intellij เท่านั้น (ดูเหมือนจะเป็นไปตามความคิดเห็น) แต่แหล่งที่มาของความจริงขั้นสุดท้ายคือ javac ซึ่งการแก้ไข ไม่ทำงาน คำตอบนี้ตอบคำถามจริงๆ: stackoverflow.com/a/20909204/2032701
Ruslan

179

เพื่อหลีกเลี่ยงคำเตือน: ไม่ได้นำเข้าชั้นเรียน

ใช้ชื่อคลาสแบบเต็มแทน

และใช้ในสถานที่ให้น้อยที่สุด


15
+1 นี่ควรเป็นคำตอบที่ยอมรับได้ มีประโยชน์ในการไม่ระงับการเลิกใช้งานทั้งชั้นเรียน
k_g

11
นี่คือคำตอบที่ดีกว่า@SuppressWarningsในระดับชั้นเรียนไม่ครอบคลุมการนำเข้า
Alex

7
นี่เป็นคำตอบที่ดีที่สุดจนถึง Java 9 ซึ่งในที่สุดได้รับการแก้ไขแล้ว: bugs.openjdk.java.net/browse/JDK-8032211
Christopher

14

ในฐานะแฮ็คคุณไม่สามารถนำเข้าและใช้ชื่อที่มีคุณสมบัติครบถ้วนภายในรหัสได้

คุณอาจลองใช้ javac -Xlint: -deprecation ไม่แน่ใจว่าจะตอบสนองได้หรือไม่


9

ฉันแก้ไขสิ่งนี้โดยเปลี่ยนการนำเข้าเป็น:

import package.*

จากนั้นใส่คำอธิบายประกอบวิธีที่ใช้คลาสที่เลิกใช้กับ@SuppressWarnings("deprecation")


อย่านำเข้าทุกอย่างจากทั้งแพ็คเกจ มันจะส่งผลต่อประสิทธิภาพ คอมไพเลอร์ที่ไม่จำเป็นจะโหลดคลาสทั้งหมดจะส่งผลให้เกิดปัญหาด้านประสิทธิภาพที่ร้ายแรง ใช้ประโยชน์เสมอว่าคลาสที่ไม่ได้ใช้จะไม่มีอยู่ในการนำเข้าของคุณ
Arundev

1
การใช้สารานุกรมเป็นตัวอย่างที่นี่ (ใช่ฉันเดทกับตัวเอง) - หากคุณกำลังหาข้อมูลเกี่ยวกับลิงอุรังอุตังคุณเพียงแค่หยิบหนังสือ 'O' หรือคว้าหนังสือทั้งหมด?
Ascalonian

@Arundev เพื่อความชัดเจนสิ่งที่คุณพูดคือการคอมไพล์อาจใช้เวลานานกว่าจะเสร็จสมบูรณ์ แต่ในรันไทม์สิ่งนี้จะไม่มีผลกระทบใด ๆ ต่อประสิทธิภาพของการดำเนินการใช่ไหม?
Paulo

@Paulo - นั่นคือสิ่งที่ฉันพยายามจะพูดมันจะตรวจสอบความพร้อมของคลาสที่นำเข้าแม้ว่าจะไม่ได้ใช้ก็ตาม ดังนั้นหากคุณมีการนำเข้าที่ไม่ได้ใช้จำนวนมากควรลบออกเสมอ
Arundev

7

สมมติว่าคุณกำลังลบล้าง / ใช้งานอินเทอร์เฟซด้วยเมธอดที่เลิกใช้แล้ว (เช่น getUnicodeStream (String columnLabel) ใน java.sql.ResultSet) คุณจะไม่กำจัดคำเตือนการเลิกใช้งานเพียงแค่ใช้คำอธิบายประกอบ @SuppressWarnings ("deprecation") เว้นแต่คุณจะใส่คำอธิบายประกอบวิธีการใหม่เดียวกันด้วยคำอธิบายประกอบ @Deprecated นี่เป็นเหตุผลเพราะไม่เช่นนั้นคุณสามารถ "ไม่เข้าใจ" เมธอดได้โดยเพียงแค่ลบล้างคำอธิบายอินเทอร์เฟซ


การรวมกันของ "@SuppressWarnings" และ "@Deprecated" นี้ยังใช้ได้กับการเรียกเมธอดที่เลิกใช้แล้วภายในวิธีของคุณเอง
Swav

1
ฉันมองหาคำอธิบายนั้นมานานแล้ว ขอบคุณ!
Jabari Dash

2

คุณสามารถใช้ได้:

javac FileName.java -Xlint: -deprecation

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

ในกรณีของฉันฉันถูกใช้ในขณะที่คอมไพเลอร์ต้องการให้ผมใช้someListItem.addItem("red color")someListItem.add("red color");

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