Скрытые возможности Java

После прочтения скрытых возможностей C # я задумался: каковы некоторые из скрытых возможностей Java?

295 java
19.08.2008 01:36:03
Обратите внимание, что не всегда хорошая идея использовать эти скрытые функции; часто они удивляют и запутывают других, читающих ваш код.
Kevin Bourrillion 5.11.2009 18:10:36
Вы (/ кто-то) должны, вероятно, аккуратно суммировать ответы в теле вопроса, как вопрос C #.
ripper234 10.12.2009 19:34:54
30 ОТВЕТОВ

Ключевое слово assert на уровне языка .

37
19.08.2008 01:51:22
Проблема с assert заключается в том, что он должен быть включен во время выполнения.
extraneon 21.05.2009 15:42:49
Но если он отключен, значит, его там нет. Вы можете добавить в код столько утверждений, сколько захотите, и у вас не будет никакого снижения производительности, если они отключены.
Ravi Wallau 9.08.2009 05:15:29
Я считаю, что это хорошая вещь об утверждении: его можно отключить без штрафа.
andref 11.07.2010 17:41:30
проблема в том, что если вы случайно внедрили побочный эффект в утверждении, вы должны включить утверждение, чтобы ваша программа работала ...
Chii 12.10.2010 11:15:44
Чтобы определить, включены ли подтверждения, вы можете использовать {boolean assertsOn = false; assert assertsOn = true; if (assertsOn) {/ * комплексная проверка * /}}. Это также позволяет регистрировать или выдавать исключение, если состояние assert не ожидается.
fernacolo 23.06.2011 18:26:21

Мне действительно нравится переписанный API Threading от Java 1.6. Callables великолепны. В основном это потоки с возвращаемым значением.

17
19.08.2008 02:03:53
По сравнению со старыми вещами все просто
Allain Lalonde 12.09.2008 15:59:37
В основном существуют ExecutorServices, на которые вы можете отправлять Callables. Когда вы отправляете Callable в ExecutorService, вы возвращаете Future, у которого есть блокирующий вызов для получения результата Callable (или вы можете спросить его, есть ли еще результат, неблокирующий).
Adam Jaskiewicz 7.01.2009 19:14:55
ExecutorService - это некоторый способ запуска Callables (и Runnables). Это может быть отдельный фоновый поток, он может быть поддержан пулом потоков, он может даже запускать задачи последовательно в текущем потоке. Зависит от реализации.
Adam Jaskiewicz 7.01.2009 19:16:57
Существует также служба CompletionService, в которую могут быть отправлены Callables, а результаты помещаются в очередь для потребления по окончании.
Adam Jaskiewicz 7.01.2009 19:33:22

статический импорт для «улучшения» языка, так что вы можете делать красивые буквальные вещи безопасными для типов способами:

List<String> ls = List("a", "b", "c");

(можно также сделать с картами, массивами, наборами).

http://gleichmann.wordpress.com/2008/01/13/building-your-own-literals-in-java-lists-and-arrays/

Продолжая это:

List<Map<String, String>> data = List(Map( o("name", "michael"), o("sex", "male")));
25
19.08.2008 02:15:15
Очень плохо, что этот тип функциональности отсутствует непосредственно в API коллекций.
Chris Mazzola 7.10.2008 12:36:32
это не часть языка; автор в ссылке определяет метод «Список» для создания списка
kdgregory 1.01.2009 13:23:55
Это такой метод: ... public static <T> List <T> List (T ... elems) {return Arrays.asList (elems); } Вы также можете написать: List <String> myList = new ArrayList <String> (Arrays.asList ("Один", "Два", "Три")); // как уже упоминалось в другом посте
xgMz 22.04.2009 19:27:32
Разве это не шаблон дизайна фабрики? Очень полезно, конечно, особенно с varargs.
extraneon 21.05.2009 15:28:13
статический импорт java.util.Arrays; List <String> names = asList ("jim", "john")
opsb 29.10.2010 09:19:58

Я думаю, что еще одна «упущенная» особенность Java - сама JVM. Это, вероятно, лучшая доступная виртуальная машина. И он поддерживает множество интересных и полезных языков (Jython, JRuby, Scala, Groovy). Все эти языки могут легко и без проблем сотрудничать.

Если вы разрабатываете новый язык (как в случае с scala), вы сразу же получаете все имеющиеся библиотеки, и поэтому ваш язык «полезен» с самого начала.

Все эти языки используют оптимизацию HotSpot. ВМ очень хорошо контролирует и отлаживается.

62
19.08.2008 16:47:35
На самом деле это не очень хорошая виртуальная машина. Он был разработан исключительно для запуска JAVA. Типичные динамические и функциональные языки плохо работают с ним. Если вы хотите использовать виртуальную машину, вы должны использовать .NET / Mono. Это было разработано для работы с КАЖДЫМ языком ...
Hades32 22.06.2009 17:33:50
На самом деле JVM предназначена исключительно для запуска байт-кодов Java. Вы можете компилировать большинство современных языков в байт-код Java. Единственным недостатком Java Bytecode является поддержка динамического языка, указателей и хвостовой рекурсии.
mcjabberz 18.09.2009 15:43:32
@ Hades32: на самом деле .NET VM очень похожа на JVM. Он только недавно получил поддержку динамических языков (с DLR), и Java 7 также собирается получить эту поддержку. И классический «КАЖДЫЙ язык» .NET (C #, Visual Basic .NET, ...) все имеют практически одинаковый набор функций.
Joachim Sauer 27.11.2009 08:12:32
JVM не поддерживает дженерики, в то время как .NET VM поддерживает. JVM далеко не самый лучший.
Blindy 27.11.2009 08:52:19
Не стоит сбрасывать со счетов жалобы на специфические языковые функции, которые не поддерживаются непосредственно JVM ... но я склонен считать, что стабильность, кросс-платформенная согласованность и хорошая производительность намного превосходят причины, по которым JVM получает дополнительные очки. Я уже много лет работаю с серверной Java на многих платформах (включая AS / 400) и смог полностью забыть об этом - ошибки почти всегда есть в коде, который я могу исправить, и это просто не падает
Rob Whelan 8.01.2012 20:22:01

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

ThreadLocals обычно не так широко известны как способ хранения состояния для каждого потока.

Поскольку JDK 1.5 Java имеет чрезвычайно хорошо реализованные и надежные инструменты параллелизма, помимо просто блокировок, они живут в java.util.concurrent, и особенно интересным примером является подпакет java.util.concurrent.atomic, который содержит потокобезопасные примитивы, которые реализуют сравнение -and-swap операция и может отображаться на реальные версии этих операций с аппаратной поддержкой.

432
10.05.2012 11:47:01
Инициализация в двойных скобках ... странно ... Я бы с осторожностью воспринял эту конкретную идиому слишком широко, поскольку она фактически создает анонимный подкласс объекта, что может привести к сбивающим с толку проблемам равно / хэш-кода. java.util.concurrent - действительно отличный пакет.
MB. 17.09.2008 12:02:04
Я преподавал Java, и это первый раз, когда я сталкиваюсь с этим синтаксисом ... который показывает, что вы никогда не прекращаете учиться = 8-)
Yuval 23.09.2008 08:48:05
Обратите внимание, что если вы сохраняете ссылку на коллекцию, инициализированную с помощью этой идиомы «двойная скобка» (или если мы называем ее его реальным именем - анонимный класс с блоком инициализатора), вы неявно удерживаете ссылку на внешний объект, который может вызвать неприятную память утечки. Я бы рекомендовал избегать этого вообще.
ddimitrov 5.10.2008 13:05:13
«Двойная инициализация» - это очень эвфемистическое имя для создания анонимного внутреннего класса, приукрашивания того, что на самом деле происходит, и его звучания, как будто внутренние классы предназначены для такого использования. Это шаблон, который я предпочел бы оставаться скрытым.
erickson 23.10.2008 14:27:39
Практически это не статический блок, а «блок инициализатора», который отличается, поскольку он выполняется в другое время (более подробную информацию см. По ссылке, которую я вставил в ответ)
Boris Terzic 11.03.2009 09:49:47

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

15
29.08.2008 21:05:03
Nivas 27.01.2009 20:56:55
Есть ли какая-то связь между объектно-ориентированным программированием и отсутствием "goto"?
Adrian Pronk 1.02.2010 07:51:41

Как стартер, я действительно ценю программное обеспечение для мониторинга JConsole в Java 6, оно уже решило несколько проблем для меня, и я продолжаю находить новые применения для него.

Очевидно, JConsole уже была в Java 5, но я считаю, что она улучшена сейчас и, по крайней мере, работает намного стабильнее на данный момент.

JConsole в Java 5: JConsole в Java 5

JConsole в Java 6: JConsole в Java 6

И пока вы в этом разбираетесь, ознакомьтесь с другими инструментами серии: инструментами устранения неполадок Java 6

23
20.08.2008 11:30:49
JConsole будет заменена vy VisualVM в будущих версиях (возможно, 6u10?)
Tom 27.09.2008 11:10:52
Конечно, JConsole будет заменен или скорее улучшен, я думаю, уже с 6u7. Но многие все еще используют более старые версии suns JVM и поэтому нуждаются в JConsole. Я до сих пор не нашел ничего подтверждающего теорию, что JVisualVM будет поддерживать более старые версии JDK.
PPS 14.10.2008 14:04:38

Это не совсем скрыто, но отражение невероятно полезно и мощно. Замечательно использовать простой Class.forName ("..."). NewInstance (), где тип класса настраивается. Это просто написать такую ​​реализацию фабрики.

12
29.08.2008 19:17:46
Я все время использую отражение, чтобы делать такие вещи, как <T> T [] filterItems (T []), которые затем можно вызвать с помощью items = filterItems (items); Определение метода немного уродливее, но действительно облегчает чтение клиентского кода.
Marcus Downing 17.09.2008 14:12:35
Это мощный инструмент, потому что он позволяет вам нарушить все статические гарантии и дает вам инвариантные Java, javac и интерфейсы. Используйте с особой осторожностью.
Raphael 1.03.2012 10:39:57

Как насчет ковариантных типов возвращаемых данных, которые существуют с JDK 1.5? Это довольно плохо разрекламировано, так как это несексуальное дополнение, но, насколько я понимаю, абсолютно необходимо для работы генериков.

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

class Souper {
    Collection<String> values() {
        ...
    }
}

class ThreadSafeSortedSub extends Souper {
    @Override
    ConcurrentSkipListSet<String> values() {
        ...
    }
}

Вы можете вызвать метод подкласса valuesи получить отсортированный поток, безопасный Setдля Strings, без необходимости приведения к типу ConcurrentSkipListSet.

144
29.08.2008 19:44:26
Можете ли вы привести пример использования?
Allain Lalonde 12.09.2008 15:58:30
Я часто этим пользуюсь. clone () отличный пример. Он должен возвращать Object, что означает, что вы должны сказать, например, (List) list.clone (). Однако, если вы объявите как List clone () {...}, то приведение не требуется.
Jason Cohen 14.09.2008 15:04:10

Функторы довольно крутые. Они довольно близки к указателю на функцию, что, как правило, все быстро говорят, невозможно в Java.

Функторы в Java

4
29.08.2008 19:36:48
Не невозможно, просто невозможно многословно.
Pete Kirkham 4.02.2009 16:11:04
Разве это не особенность opps, чем Java?
Ravisha 24.08.2010 07:08:14

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

// code goes here

getmeout:{
    for (int i = 0; i < N; ++i) {
        for (int j = i; j < N; ++j) {
            for (int k = j; k < N; ++k) {
                //do something here
                break getmeout;
            }
        }
    }
}

Кто сказал, что gotoв Java это просто ключевое слово? :)

156
12.05.2009 03:17:42
Что ж, я бы предпочел иметь возможность сделать это несколькими способами. Например, я видел людей, использующих System.exit (1); в коде сервлетов и EJB, но это не значит, что мы должны удалить System.exit (); от JDK, верно?
Georgy Bolyuba 8.09.2008 10:25:17
При некоторых обстоятельствах в рамках конструкции вложенного цикла может быть полезно перейти к следующей итерации внешнего цикла. Это было бы разумным использованием этой функции.
alasdairg 8.11.2008 18:57:12
Что особенно неизвестно многим программистам (и, вероятно, точно так же), так это то, что вы можете на самом деле помечать и выделять ЛЮБОЙ старый блок. Это не должен быть цикл - вы можете просто определить какой-то произвольный блок, присвоить ему метку и использовать разрыв с ним.
Neil Coffey 20.04.2009 04:10:04
Это вообще не goto, оно может вернуться только к предыдущей итерации (т.е. вы не можете прыгнуть вперед). Это тот же механизм, который возникает, когда итерация возвращает false. Говорить о том, что у java есть goto, все равно что говорить о том, что любой язык, чей компилятор создает инструкцию JUMP, имеет оператор goto
Zombies 1.10.2009 13:38:35
Таким образом, вы проводите собеседование, основываясь на мелочах Java, а не на способности решать проблемы и продумывать дизайн. Я позабочусь, чтобы я никогда не брал интервью у вашей компании. :)
Javid Jamae 24.08.2010 20:35:43

Я знал, что Java 6 включает поддержку сценариев, но я недавно обнаружил jrunscript , который может интерпретировать и запускать JavaScript (и, как полагают, другие языки сценариев, такие как Groovy) в интерактивном режиме, что-то вроде оболочки Python или irb в Ruby.

13
3.09.2008 00:33:17

Динамические прокси (добавлены в 1.3) позволяют вам определять новый тип во время выполнения, который соответствует интерфейсу. Это пригодилось удивительное количество раз.

88
10.05.2012 13:14:12
Динамические прокси - отличная причина, чтобы выбрать написать интерфейс Foo и использовать его везде с классом «FooImpl» по умолчанию. Поначалу это может показаться уродливым («Почему бы просто не иметь класс с именем Foo?»), Но преимущества с точки зрения будущей гибкости и способности к подделке для модульных тестов удобны. Хотя есть способы сделать это и для неинтерфейсов, они обычно требуют дополнительных вещей, таких как cblib.
Darien 21.04.2010 19:57:25

Объединение в дисперсию параметра типа:

public class Baz<T extends Foo & Bar> {}

Например, если вы хотите получить параметр Comparable и Collection:

public static <A, B extends Collection<A> & Comparable<B>>
boolean foo(B b1, B b2, A a) {
   return (b1.compareTo(b2) == 0) || b1.contains(a) || b2.contains(a);
}

Этот придуманный метод возвращает true, если две заданные коллекции равны или если одна из них содержит данный элемент, в противном случае - false. Следует отметить, что вы можете вызывать методы как Comparable, так и Collection для аргументов b1 и b2.

279
11.08.2009 16:13:33
Мое любимое использование для этого, когда вам нужен метод, который принимает добавляемую последовательность символов.
Neil Coffey 20.04.2009 03:51:54
Возможно ли иметь вместо "&" "ИЛИ"?
mainstringargs 16.06.2009 18:37:39
@Grasper: Нет, OR (непересекающееся объединение) в этом контексте не предусмотрено. Но вместо этого вы можете использовать непересекающийся тип объединения, например Either <A, B>. Этот тип является двойным для типа Pair <A, B>. Посмотрите на функциональную библиотеку Java или базовые библиотеки Scala для примера такого типа данных.
Apocalisp 16.06.2009 21:51:19
Вы должны сказать, что вы ДОЛЖНЫ расширять только один класс и несколько интерфейсов -> открытый класс Baz <T расширяет Clazz & Interface1 & InterfaceI ... а не класс Baz <T расширяет Clazz1 & ClazzI>
JohnJohnGa 17.10.2011 08:53:33

Я знаю, что это было добавлено в выпуске 1.5, но новый тип enum - отличная особенность. Отсутствие необходимости использовать старый «шаблон en enum» очень помогло моему коду. Проверьте JLS 8.9 для сладкого соуса на вашем картофеле!

12
4.09.2008 15:55:03
Большинство «старых школьных» Java-парней никогда не удосужились начать использовать эту функцию, но я согласен, что это здорово.
Allain Lalonde 12.09.2008 16:01:06

final для переменных экземпляра:

Действительно полезен для многопоточного кода и позволяет намного легче спорить о состоянии и правильности экземпляра. Я не видел это много в отраслевом контексте и часто не думал об уроках Java.


статический {что-то;}:

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

11
6.09.2008 09:07:16
Да, статический метод также позволит вам хорошо разбираться с исключениями, но когда вы используете статический блок, у вас нет другого выбора, кроме как перехватить (и не делать никаких соответствующих действий).
Graham Edgecombe 5.06.2009 19:00:11

Я был удивлен инициализаторами экземпляра на днях. Я удалял некоторые методы, сложенные в коде, и в итоге создал несколько инициализаторов экземпляров:

public class App {
    public App(String name) { System.out.println(name + "'s constructor called"); }

    static { System.out.println("static initializer called"); }

    { System.out.println("instance initializer called"); }

    static { System.out.println("static initializer2 called"); }

    { System.out.println("instance initializer2 called"); }

    public static void main( String[] args ) {
        new App("one");
        new App("two");
  }
}

Выполнение mainметода покажет:

static initializer called
static initializer2 called
instance initializer called
instance initializer2 called
one's constructor called
instance initializer called
instance initializer2 called
two's constructor called

Я думаю, это было бы полезно, если бы у вас было несколько конструкторов и вам нужен общий код

Они также предоставляют синтаксический сахар для инициализации ваших классов:

List<Integer> numbers = new ArrayList<Integer>(){{ add(1); add(2); }};

Map<String,String> codes = new HashMap<String,String>(){{ 
  put("1","one"); 
  put("2","two");
}};
220
13.10.2011 12:18:19
Преимущество этого перед явным методом, который должен быть вызван, состоит в том, что если кто-то позже добавляет конструктор, ему не нужно помнить, чтобы вызывать init (); это будет сделано автоматически. Это может предотвратить ошибки будущих программистов.
Mr. Shiny and New 安宇 10.10.2008 15:45:54
Также, в отличие от метода init (), он может инициализировать конечные поля.
Darron 7.01.2009 18:45:41
Что если вы расширите класс и создадите экземпляры для разных детей? Будет ли он вести себя так же?
Kezzer 27.01.2009 12:48:55
Люди часто раздают сертификаты (например, stackoverflow.com/questions/281100/281127#281127 ) и особенно ставят под сомнение их технические достоинства. Но если бы здесь училось больше программистов для своего SCJP, это не будет считаться «скрытой функцией» для многих. ;-)
Jonik 21.04.2009 08:46:19
Бьюсь об заклад, даже книга "Ява в течение 24 часов" имеет эту "очевидную особенность". читать дальше, ребята
Özgür 6.05.2009 19:40:36

Новая Эффективная Java Джошуа Блоха - хороший ресурс.

6
8.09.2008 13:24:57
Отличная книга, но в ней не так много скрытых функций.
James McMahon 16.10.2008 12:35:30

Разрешение методов и конструкторов в перечислениях удивило меня. Например:

enum Cats {
  FELIX(2), SHEEBA(3), RUFUS(7);

  private int mAge;
  Cats(int age) {
    mAge = age;
  }
  public int getAge() {
    return mAge;
   }
}

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

Больше документации здесь .

134
9.09.2008 21:10:31
Действительно потрясающая функция - делает перечисления OO и решает множество проблем инициализации очень чистым способом.
Bill K 6.10.2008 18:00:45
Enum как синглтон? Перечислить только одно значение?
Georgy Bolyuba 13.11.2008 00:01:15
Георгий: Синглтон - это один экземпляр объекта, а не объект с одним значением.
dshaw 17.11.2008 22:43:53
@ Георгий: см. Также пункт 3 «Эффективной Явы» Джошуа Блоха (2-е изд); «Хотя этот подход еще не получил широкого распространения, одноэлементный тип перечисления является лучшим способом реализации синглтона».
Jonik 21.04.2009 08:57:50
Незначительный придурок: mAgeдолжен быть окончательным. В перечислениях редко встречается причина нефинальных полей.
Joachim Sauer 6.10.2010 08:25:54

Не совсем часть языка Java, но дизассемблер javap, поставляемый с Sun JDK, широко не известен и не используется.

37
10.09.2008 17:20:11

Обязательные дженерики:

class SelfBounded<T extends SelfBounded<T>> {
}

http://www.artima.com/weblogs/viewpost.jsp?thread=136394

17
10.09.2008 20:18:12
см. также справку по справке: artima.com/weblogs/viewpost.jsp?thread=133275
Ray Tayek 1.01.2009 07:03:02

JDK 1.6_07 + содержит приложение VisualVM (bin / jvisualvm.exe), которое представляет собой приятный графический интерфейс поверх многих инструментов. Это кажется более полным, чем JConsole.

201
11.09.2008 01:15:19
И у него есть плагин (это вещь NetBeans), который позволяет ему использовать плагины Jconsole. Довольно мило.
Thorbjørn Ravn Andersen 26.05.2009 07:54:44
VisualVM - лучшая вещь из нарезанного хлеба, правда! Жаль, что он не обладает всеми функциями при работе с JDK 1.5
sandos 17.02.2010 12:26:36
Я нахожу VisualVM медленным или непригодным в некоторых обстоятельствах. Коммерческий YourKit не имеет этой проблемы, но, к сожалению, не является бесплатным.
Roalt 23.09.2010 11:33:54
Более поздние версии Visual VM, начиная с JDK 1.6.0_22 и более поздних, значительно улучшены. Могу поспорить, что JDK1.7 имеет еще лучшую версию.
djangofan 24.08.2011 20:40:24

Типовые параметры для универсальных методов могут быть указаны явно так:

Collections.<String,Integer>emptyMap()
121
11.09.2008 02:09:12
И, черт возьми, это уродливо и запутанно. И не имеет отношения к типу безопасности.
Chris Broadfoot 16.09.2008 12:21:40
Мне это нравится. Это делает ваш код немного более явным и, как таковой, более понятным для бедняги, которому придется поддерживать его через год или два.
extraneon 21.05.2009 15:30:12
Это на самом деле очень полезно в ситуациях, когда вы объявили статический универсальный метод, такой как public static <T> T foo(T t). Затем вы можете позвонитьClass.<Type>foo(t);
Finbarr 13.05.2010 08:20:39
По некоторым причинам это не работает со статически импортированными методами. Интересно, почему.
oksayt 25.04.2011 17:30:03
Это особенно полезно при использовании троичных if с возвратом. Например return set1.equals(set2) ? new ArrayList<String>(set1) : Collections.<String>emptyList(). Это также полезно для некоторых вызовов методов, где простой Collections.emptyMap () может привести к ошибке компиляции.
Andreas Holstenson 30.06.2011 20:30:34

Им потребовалось достаточно много времени, чтобы добавить поддержку этому,

Системный лоток

19
15.09.2008 15:50:33

Метод asList в java.util.Arraysпозволяет получить хорошую комбинацию varargs, универсальных методов и автобокса:

List<Integer> ints = Arrays.asList(1,2,3);
56
15.09.2008 15:55:15
вы хотите обернуть возвращенный список конструктором List, иначе int будет иметь фиксированный размер (так как он поддерживается массивом)
KitsuneYMG 4.08.2009 13:39:44
Arrays.asListИмеет необычную особенность , что вы можете set()элементы , но не add()или remove(). Поэтому я обычно оборачиваю его в a new ArrayList(...)или в a Collections.unmodifiableList(...), в зависимости от того, хочу ли я изменить список или нет.
Christian Semrau 3.12.2010 22:31:07

Некоторые трюки управления потоком, finallyвокруг returnутверждения:

int getCount() { 
  try { return 1; }
  finally { System.out.println("Bye!"); }
}

Правила для определенного присваивания проверят, что конечная переменная всегда присваивается посредством простого анализа потока управления:

final int foo;
if(...)
  foo = 1;
else
  throw new Exception();
foo+1;
6
15.09.2008 16:08:02

JVisualVM из каталога bin в дистрибутиве JDK. Отслеживание и даже профилирование любого Java-приложения, даже если вы не запускали его с какими-либо специальными параметрами. Только в последних версиях Java 6SE JDK.

7
15.09.2008 16:19:57
Если вы используете Spring для создания своих аннотированных компонентов JMX для работы с jconsole и jvisualvm, вам нужно вручную запустить интерфейс управления, а не полагаться на созданный по умолчанию VM. Если вы этого не сделаете, у вас возникнут проблемы с наличием множества конфликтующих «синглетонов», и ваши компоненты JMX будут аккуратно оказываться не в том виде…
Donal Fellows 11.06.2010 08:49:21

Передача контроля в блоке finally исключает любые исключения. Следующий код не выбрасывает RuntimeException - он теряется.

public static void doSomething() {
    try {
      //Normally you would have code that doesn't explicitly appear 
      //to throw exceptions so it would be harder to see the problem.
      throw new RuntimeException();
    } finally {
      return;
    }
  }

От http://jamesjava.blogspot.com/2006/03/dont-return-in-finally-clause.html

142
3.03.2010 14:56:20
Это неприятно, но это также своего рода логическое следствие того, как наконец-то работает. Управление потоком try / catch / finally делает то, что предназначено, но только в определенных пределах. Точно так же вы должны быть осторожны, чтобы не вызывать исключение внутри блока catch / finally, или вы также выбросите исходное исключение. И если вы выполните System.exit () внутри блока try, блок finally не будет вызван. Если вы нарушаете нормальный поток, вы нарушаете нормальный поток ...
Neil Coffey 20.04.2009 03:54:47
Не используйте наконец {return; } но, наконец, {код без возврата}. Это логично, поскольку, наконец, также предполагается выполнение при возникновении исключений, и единственным возможным значением возврата в качестве обработчика исключений должно быть игнорирование исключения и - действительно - возврат.
extraneon 21.05.2009 15:21:42
Это больше похоже на «уловку», чем на скрытую функцию, хотя есть способы, которыми ее можно использовать как единое целое, использование этого метода не будет хорошей идеей.
davenpcj 3.06.2009 20:00:14
Затмение выдает предупреждение, если вы делаете это. Я с Затмением. Если вы хотите поймать исключение ... тогда поймайте исключение.
helios 3.03.2010 15:24:38
Это то, что вы платите за грязный код, который возвращается из середины метода. Но все равно хороший пример.
Rostislav Matl 22.06.2010 12:21:36

Добавление конструкции для каждого цикла в 1.5. Я <3 это.

// For each Object, instantiated as foo, in myCollection
for(Object foo: myCollection) {
  System.out.println(foo.toString());
}

И может использоваться во вложенных экземплярах:

for (Suit suit : suits)
  for (Rank rank : ranks)
    sortedDeck.add(new Card(suit, rank));

Конструкция for-each также применима к массивам, где она скрывает переменную индекса, а не итератор. Следующий метод возвращает сумму значений в массиве int:

// Returns the sum of the elements of a
int sum(int[] a) {
  int result = 0;
  for (int i : a)
    result += i;
  return result;
}

Ссылка на документацию Sun

36
16.09.2008 18:35:19
Я думаю, что использование iздесь очень запутанно, так как большинство людей ожидают, что я буду индексом, а не элементом массива.
cdmckay 23.02.2009 07:28:53
Итак ... int sum (int [] array) {int result = 0; for (int element: array) {result + = element; } вернуть результат; }
Drew 10.03.2009 23:27:37
Единственное, что сводит меня с ума по этому поводу, это то, что кажется, что было бы действительно легко создать ключевое слово для доступа к значению счетчика циклов, но вы не можете. Если я хочу зациклить два массива и внести изменения в секунду на основе значений в первом, я вынужден использовать старый синтаксис, поскольку у меня нет смещения во втором массиве.
Jherico 19.05.2009 21:34:02
Жаль, что он не работает и с перечислениями, как те, что используются в JNDI. Это вернулось к итераторам там.
extraneon 21.05.2009 15:32:29
@extraneon: взгляните на Collections.list (перечисление <T> e). Это должно помочь с повторяющимися перечислениями в цикле foreach.
Werner Lehmann 24.03.2010 23:49:43