ทำไม Java จึงไม่ใส่ชื่อไฟล์ลงไป?


20

ใน C และ C ++, วิธีการหลักเก็บชื่อไฟล์ในตำแหน่งแรกของอาร์เรย์ที่ argv [0] อย่างไรก็ตามใน Java ชื่อไฟล์จะไม่รวมอยู่ในอาร์เรย์สตริง args

มีเหตุผลในทางปฏิบัติสำหรับสิ่งนี้หรือไม่? ฉันเข้าใจว่าสิ่งนี้ทำให้การวนซ้ำผ่านอาร์กิวเมนต์บรรทัดคำสั่ง 0-based แทน 1-based แต่มีประโยชน์ไหม? ชื่อไฟล์นั้นถือว่าไร้ประโยชน์หรือไม่?

คำตอบ:


17

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


โดยปกติแล้วโปรแกรม Java จะถูกเรียกใช้เป็น:

% java -jar foo.jar args
% java Foo เกิดขึ้น

รุ่นแรกคือที่ที่คุณมีไฟล์มานิเฟสต์ซึ่งระบุคลาสหลักรุ่นที่สองจะรันเมธอดหลักในคลาสที่Fooพบในพา ธ ของคลาส

ข้อมูลที่นำเสนอสำหรับ Java เป็นเส้นทางไปยัง jar หรือชื่อของคลาสที่ถูกเรียกใช้

ตำแหน่งของโถไม่สำคัญพอที่จะเป็นรหัสจาก (และจริง ๆ แล้วไม่ได้เป็นส่วนหนึ่งของข้อมูลจำเพาะดั้งเดิม) Jar สามารถตั้งชื่ออะไรก็ได้จริง ๆ และมักจะมีหมายเลขรุ่น ยิ่งไปกว่านั้นไม่มีอะไรรับประกันได้ว่าชั้นจะถูกเก็บไว้ใน. jar (มันสามารถถูกดึงออกมา)

การเรียกใช้แอปพลิเคชัน Java ด้วย-jarมีเพียงวิธีเดียวในการป้อนคลาสที่กำหนดใน Manifest ไม่มีการเปลี่ยนชื่อที่สามารถทำได้

ตัวเลือกอื่นของการเรียกใช้พร้อมกับชื่อคลาสชี้ไปยังหน่วยดำเนินการโดยตรง อีกต่อไปมันไม่สามารถตั้งชื่อคูณ - คุณไม่สามารถBar.classเป็นรหัสสำหรับclass Fooมันก็ไม่ได้ทำงานอย่างนั้น

นี่ควรจะแสดงให้เห็นว่าไม่มีจุดใดที่จะส่งผ่านข้อมูลของargv[0]ในภาษา C ไปยังแอปพลิเคชัน Java ซึ่งอาจเป็นไปได้javaไร้ความหมายและไม่มีกฎเกณฑ์หรือชื่อของคลาสที่ถูกเรียกใช้ จาก (คุณสามารถทำบางอย่างเช่นgetClass().getEnclosingClass().getName()ถ้าคุณหมดหวัง ... )

มีจุดที่นี่คุณสามารถกำหนดหลายวิธีการหลักในชั้นเรียนใน. jar หรือบนเส้นทางชั้นเรียน และคุณสามารถทำให้พวกมันมีพฤติกรรมที่แตกต่างราวกับว่ามีชุดของคำสั่งที่ยึดตามสิ่งที่argv[0]เป็นอยู่

ฉันมีในอดีตมีรหัสคล้ายกับjava -cp Foo.jar com.me.foo.Testที่เรียกTestวิธีการหลักของชั้นเรียนมากกว่าที่กำหนดไว้ในหนึ่งที่กำหนดไว้ในรายการ


จะต้องมีมากไปกว่านั้น ใน C #, พารามิเตอร์ที่ไม่ได้มีชื่อไฟล์ foo.exeแต่แอพลิเคชันมักจะถูกดำเนินการโดยตรงเพียง
svick

@svick ฉันไม่คุ้นเคยกับ C # หรือวิธีการจัดแพคเกจ exe ในระบบปฏิบัติการไม่กี่แห่งคุณสามารถสร้าง jar ที่ปฏิบัติการได้ (ดูสิ่งนี้ ) ซึ่งเรียกใช้งานจุดเริ่มต้นที่กำหนดใน Manifest สิ่งที่คล้ายกันอาจทำได้สำหรับ C # สิ่งสำคัญคือคุณไม่สามารถเปลี่ยนจุดเข้าใช้งานด้วยการเปลี่ยนชื่อของไฟล์และส่วนอื่น ๆ ของแอปพลิเคชันไม่ได้มีวัตถุประสงค์เพื่อใช้ชื่อไฟล์ (นอกคลาสโหลดเดอร์)

@nqzero ( บริบท ) - หากฉันระบุjava com.me.Fooเป็นบรรทัดคำสั่งเมธอดcom.me.Foo.main(String...)จะถูกเรียกใช้ ไม่มีทางรอบนั้น และฉันรู้ว่ามันคือฟูที่กำลังถูกเรียก - ไม่มีเหตุผลที่จะพูดเรื่องนั้นใน argv มันจะเป็นข้อมูลซ้ำซ้อนอย่างหมดจด แน่นอนว่ามันอาจเป็นใน superclass แต่ฉันมีโอกาสเล็กน้อยที่จะสกัดกั้นมันด้วยข้อมูลที่ต้องการว่าการเรียกใช้บรรทัดคำสั่งคืออะไร - ไม่จำเป็นต้องใส่ไว้ใน argv

... และโปรดจำไว้ว่าให้รับ 50 ตัวแทนและแสดงความคิดเห็นแทนที่จะแนะนำการแก้ไขคำตอบ มันเป็นวิธีที่ดีมากในการแจ้งปัญหากับโพสต์ที่ระบุ

บางครั้งพฤติกรรมนั้นแตกต่างอย่างสิ้นเชิง wput สำหรับอินสแตนซ์เป็นจริง wget
mckenzm

-4

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


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