общедоступная статическая последняя переменная в импортированном классе Java

Хм... Я не уверен точно , что Вы хотите здесь, но вот является "один уровень" опцией:

public static IEnumerable<TElement> Flatten<TElement,TSequence> (this IEnumerable<TSequence> sequences)
    where TSequence : IEnumerable<TElement> 
{
    foreach (TSequence sequence in sequences)
    {
        foreach(TElement element in sequence)
        {
            yield return element;
        }
    }
}

, Если это не то, что Вы хотите, Вы могли обеспечить подпись того, что Вы действительно хотите? Если Вам не нужна универсальная форма, и Вы просто хотите сделать вид вещи, которую делают LINQ конструкторам XML, это довольно просто - хотя рекурсивное использование блоков итератора относительно неэффективно. Что-то как:

static IEnumerable Flatten(params object[] objects)
{
    // Can't easily get varargs behaviour with IEnumerable
    return Flatten((IEnumerable) objects);
}

static IEnumerable Flatten(IEnumerable enumerable)
{
    foreach (object element in enumerable)
    {
        IEnumerable candidate = element as IEnumerable;
        if (candidate != null)
        {
            foreach (object nested in candidate)
            {
                yield return nested;
            }
        }
        else
        {
            yield return element;
        }
    }
}

Примечание, что, который будет рассматривать строку как последовательность символов, однако - можно хотеть к строкам особого случая быть отдельными элементами вместо того, чтобы сгладить их, в зависимости от варианта использования.

, который помогает?

18
задан mauris 7 November 2009 в 14:00
поделиться

4 ответа

Если значения переменных final из класса ClassA оказываются константами времени компиляции, компилятор мог бы встроить их в классы, используя ClassA вместо создания ссылки времени выполнения. Я думаю, именно это и произошло в описанном вами случае.

Пример:

public class Flags {
    public static final int FOO = 1;
    public static final int BAR = 2;
}

public class Consumer {
    public static void main(String[] args) {
         System.out.println(Flags.FOO);
    }
}

В этом примере компилятор, вероятно, включит значение FOO в код, созданный для Consumer вместо создания эквивалентной ссылки времени выполнения. Если значение FOO изменится позже, вам придется перекомпилировать Consumer , чтобы он использовал новое значение.

Это оптимизация, которая имеет несколько преимуществ относительно эффективности и скорости скомпилированной программы. Например,

23
ответ дан 30 November 2019 в 07:50
поделиться

Это проблема двоичной совместимости. Ссылки на постоянные поля разрешаются во время компиляции. Вы видите правильное поведение; если вы измените значения в классе A, вам придется перекомпилировать клиент (класс B). Чтобы избежать таких проблем, рассмотрите возможность добавления констант с использованием типа перечисления, представленного в версии 5.0 Java.

3
ответ дан 30 November 2019 в 07:50
поделиться

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

Используйте систему сборки, такую ​​как maven или ant, или просто позвольте вашей среде IDE сделать это.

Единственное безопасное решение - это сделать перекомпилируйте каждую java, которая зависит от java-класса, который изменился, пока каждый класс, который мог быть выполнен, не будет повторно скомпилирован.

2
ответ дан 30 November 2019 в 07:50
поделиться

Если вы не используете значения в переключателе, вы можете сделать это вместо этого:

public class A
{
    public static final int FOO;
    public static final String BAR;

    static
    {
        FOO = 42;
        BAR = "Hello, World!";
    }
}

, тогда компилятор больше не будет жестко кодировать значения в других классах, которые их используют.

2
ответ дан 30 November 2019 в 07:50
поделиться
Другие вопросы по тегам:

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