Почему не делает основного использования Java список аргументов переменной длины?

У меня есть вопрос о синтаксисе Java main объявление:

public static void main (String[] args)

Так как можно передать переменное количество Строк при вызове основной функции, разве это не должно быть списком аргументов переменной длины, а не массивом? Почему был бы вызов командной строки этого метода со списком строковых параметров даже работать? (Если нет закулисная обработка, которая создает массив со списком строк и затем передает тот массив основному методу...?) Разве основное объявление не должно быть чем-то больше как это...? -

public static void main(String... args) 
23
задан froadie 4 February 2010 в 17:25
поделиться

8 ответов

main (String ... args) и main (String [] args) фактически одно и то же: что вы получаете массив String . Varargs - это просто синтаксический сахар для вызывающего.

Думаю, поскольку вы никогда не вызываете main () из кода, он не был модифицирован, когда были введены varargs.

Править : На самом деле, сотрите последнее предложение. main (String ... args) , конечно, совершенно правильный синтаксис. Эти два стиля полностью взаимозаменяемы. Это прекрасно работает:

public class Test {

    public static void main(String... args) {
        System.out.println("Hello World");
    }

}
40
ответ дан 29 November 2019 в 00:57
поделиться

Не существует основного метода Java , фактически вы можете объявить массив как vararg в вашем основном методе :

public static void main(String... args) { System.out.println("Hi!"); }
6
ответ дан 29 November 2019 в 00:57
поделиться

Это ОЧЕНЬ ненаучно, но я подумал, что было бы интересно посмотреть, сколько результатов Google было связано с сочетанием общих ответов на этот вопрос и термином «многие ко многим».

Исходя из этого, похоже, что «join table» является наиболее часто используемым термином для... um... joining table в отношении «многие ко многим».


Комбинированные поисковые термины

«объединить таблицу» «многие ко многим»

возвращают около 13 700 результатов в Google.

«таблица связей» «многие ко многим»

возвращает около 4700.

«таблица соединений» «многие ко многим»

возвращает около 3500.

«таблица ассоциации» «многие ко многим»

возвращает около 3300.

«таблица отношений» «многие ко многим»

возвращает около 3200.

«таблица пересечений» «многие ко многим»

возвращает около 1500.

«таблица перекрестных ссылок» «многие ко многим»

возвращает 1000.

gerund «многие ко многим»

возвращает только 450.

-121--1608094-

YUI 3,0 не поддерживает моделирование событий change , как вы обнаружили. Однако он будет поддерживаться в YUI 3.1. Это в багажнике .

Ваша третья попытка:

Y.get('#mynode').simulate('change');

должна работать в 3.1.

edit

Похоже, вы можете просто заменить версию YUI 3.0 event-simulate.js магистральной версией, и в противном случае она будет работать в приложении 3.0.

-121--2350334-

Не должно ли основное объявление быть чем-то более подобным...?

public static void main(String... args) 

На самом деле, это можно сделать без проблем.

Это было последовательность [] args до того, как var args были введены, но в настоящее время оба работают.

1
ответ дан 29 November 2019 в 00:57
поделиться

Основной метод был разработан для Java 1.0.

Синтаксис "..." был введен в Java 1.5

Он реализован через массив определенного вами типа (я предполагаю, но ... если байтовые коды Java 1.4 и 1.5 совместимы, значит, он должен быть реализован с массивами).

9
ответ дан 29 November 2019 в 00:57
поделиться

Основной синтаксис java предшествует varargs, которые были введены только в java 1.5.

1
ответ дан 29 November 2019 в 00:57
поделиться

Нет такого метода построения, как SerialityObject, но его не очень трудно кодировать.

public void SerializeObject(this List<string> list, string fileName) {
  var serializer = new XmlSerializer(typeof(List<string>));
  using ( var stream = File.OpenWrite(fileName)) {
    serializer.Serialize(stream, list);
  }
}

И десериализация

public void Deserialize(this List<string> list, string fileName) {
  var serializer = new XmlSerializer(typeof(List<string>));
  using ( var stream = File.OpenRead(fileName) ){
    var other = (List<string>)(serializer.Deserialize(stream));
    list.Clear();
    list.AddRange(other);
  }
}
-121--3080457-

Для обработки выходных данных необходим другой форматер. Поставьте это после вашего кода:

NSDateFormatter *anotherDateFormatter = [[NSDateFormatter alloc] init];   
[anotherDateFormatter setDateStyle:NSDateFormatterLongStyle];
[anotherDateFormatter setTimeStyle:NSDateFormatterShortStyle];
NSLog(@"%@", [anotherDateFormatter stringFromDate:myDate]);
-121--1098836-

Вы можете объявить основной в любом случае, и это работает просто нормально. Проблем «обратной совместимости» или «модернизации» нет. Однако читатели вашего кода могут считать его отвлекающим, и вряд ли он путь улучшит вашу программу.

В разделе «Спецификация языка Java» (третье издание) 8,4,1 говорится, что «Если последний формальный параметр является параметром переменной арности типа T , считается, что он определяет формальный параметр типа T [] ».

Спецификация запуска программы Java содержится в JLS 12,2 , которая ссылается на главу 5 спецификации виртуальной машины. В разделе спецификации виртуальной машины 5,2 указано, что виртуальная машина вызывает метод открытого класса « void main (Последовательность []) ». Поскольку спецификация ВМ не имеет понятия переменной арности, основная, которая была объявлена с помощью "... "удовлетворяет требованию.

15
ответ дан 29 November 2019 в 00:57
поделиться

main (Последовательность... args) и main (Последовательность [] args) фактически одно и то же: вы получаете массив Последовательностей . Варарги - это просто синтаксический сахар для звонящего.

Я полагаю, что, поскольку вы никогда не называете main () из кода, он не был модифицирован при введении varargs.

Изменить : На самом деле, поцарапать это последнее предложение. main (Последовательность... args) , конечно, вполне действителен синтаксис. Эти два стиля полностью взаимозаменяемы. Это работает просто:

public class Test {

    public static void main(String... args) {
        System.out.println("Hello World");
    }

}
-121--1550624-

Прежде всего, я бы всегда имел значение по умолчанию в операторе switch . Даже если вокруг нет идиотов, которые могли бы выдать int egers enum s, всегда существует вероятность повреждения памяти, которую может помочь поймать default . В соответствии с правилами MISRA наличие значения по умолчанию является обязательным требованием.

Что касается того, что вы делаете, это зависит от ситуации. Если исключение может быть обработано надлежащим образом, обработайте его. Если это переменная состояния в некритической части кода, рассмотрите возможность бесшумного сброса переменной состояния в исходное состояние и продолжения (возможно, регистрации ошибки для будущей ссылки). Если это приведет к тому, что вся программа рухнет действительно грязным путем, попробуйте упасть изящно или что-то в этом роде. Короче говоря, все зависит от того, что вы переключаете и насколько плохим будет неправильное значение.

-121--1855988-

Что ж, 2-й синтаксис является всего лишь разновидностью 1-го и да, было бы неплохо, но он не встроен в Java в данный момент

0
ответ дан 29 November 2019 в 00:57
поделиться

Почему тебя это волнует? Никто не вызывает основной метод вручную. Это внутреннее для Java.

РЕДАКТИРОВАТЬ: Думаю, сейчас это не имеет значения, поскольку вы можете определить основной метод как:

public static void main(String... args);

Моя точка зрения все еще в силе, поскольку никто не вызывает main явно.

-2
ответ дан 29 November 2019 в 00:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: