Чому Java не вводить ім'я файлу в аргументи?


20

У C і C ++ основний метод утримує ім'я файлу в першому положенні масиву в argv [0]. Однак у Java ім'я файлу не входить до масиву рядків args.

Чи є для цього практична причина? Я розумію, що це робить ітерацію через аргументи командного рядка на основі 0 замість 1, але чи є користь? Чи ім'я файлу просто вважалося марним?

Відповіді:


17

У деяких випадках програма може бути запущена різними способами і проявляти різну поведінку щодо того, як вона викликається. Якщо ви телефонуєте vimяк vi, він працює в режимі сумісності. Іноді варто спробувати підтримувати одну версію декількох пов’язаних програм - наприклад, mailqі newaliasesна багатьох системах Unix є посилання на sendmailте, щоб ці програми залишалися синхронізованими)


Програми Java зазвичай викликаються як:

% java -jar foo.jar args
% аргументи java Foo

У першій версії є файл Manifest, який вказує на основний клас, друга версія запускає основний метод у класі, Fooзнайденому на шляху до класу.

Інформація, представлена ​​для Java, - це або шлях до баночки, або назва класу, що викликається.

Розташування баночки недостатньо важливе, щоб було з чого кодувати (і насправді не було частиною оригінальної специфікації). Jar можна назвати будь-що дійсно, і часто включає номери версій. Більше того, немає гарантії, що клас навіть зберігався у .jar (його можна було витягти).

Викликання програми Java -jarмає лише один спосіб ввести її - клас, визначений у Manifest. Перейменування не може бути зроблено.

Інший варіант - виклик його з назвою класу безпосередньо до одиниці виконання. Крім того, його не можна назвати множити - у вас не може Bar.classбути коду, class Fooвін просто не працює таким чином.

Це повинно показувати, що насправді немає сенсу передавати інформацію argv[0]в сенсі С додатку Java - це буде javaбезглуздим і довільним, або ім'ям класу, на який викликається (що ви вже виконуєте код з (ти міг би зробити щось на кшталт, getClass().getEnclosingClass().getName()якби ти відчайдушно ...)).

Тут є сенс, ви можете визначити кілька основних методів у класах в .jar або на шляху до класу. І ви могли б змусити їх поводитись інакше так, як якщо б була серія, якщо висловлювання засновані на тому, що argv[0]було.

У мене в минулому був схожий код, на java -cp Foo.jar com.me.foo.Testякий посилався на Testосновний метод класу, а не на той, який визначений у тому, який визначений у Manifest.


Має бути більше, ніж це. У C # параметри не містять імені файлу, але програма, як правило, виконується безпосередньо, просто foo.exe.
svick

@svick Я не знайомий із C #, а також як пакується exe. За декількох ОС ви можете зробити jar виконуваним (див. Це ), який запускає точку входу, визначену в Manifest. Подібні речі можуть бути зроблені і для C #. Ключові речі - ви не можете змінити точку введення, змінивши ім'я файлу, і ім'я файлу не призначене для використання в будь-яких інших частинах програми (поза завантажувачем класів).

@nqzero ( контекст ) - Якщо я вказую java com.me.Fooяк командний рядок, метод com.me.Foo.main(String...)викликається. Навколо цього немає способу. І я знаю, що саме на нього звертається Foo - немає ніяких причин дотримуватися цього в argv. Це була б суто зайва інформація. Звичайно, це може бути в суперкласі, але у мене є тривіальна можливість перехопити його бажаною інформацією про те, що було викликом командного рядка - не потрібно вводити його в argv.

... і не забудьте отримати 50 повторень та коментарів, а не пропонувати зміни у відповіді. Це дуже поганий спосіб підняти питання з даною посадою.

Іноді поведінка докорінно відрізняється. Наприклад, wput - це фактично wget.
mckenzm

-4

насправді від цього немає ніякої користі, це дійсно залежить від синтаксису мови програмування, яку ви використовуєте, якщо вона базується на 0 або 1. змінна (ви називаєте ім'я файлу) також залежить від мови, вона може бути різною в інших мовах, просто дотримуйтесь правильного синтаксису мови, якою ви користуєтесь.


1
як це відповідає на поставлене запитання?
гнат
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.