Скрытые функции Java

295
задан 5 revs, 4 users 57% 23 May 2017 в 02:26
поделиться

87 ответов

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

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

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

432
ответ дан 2 revs, 2 users 88% 23 November 2019 в 01:34
поделиться

Едва ли функция, но забавный прием я недавно обнаружил в некоторой Веб-странице:

class Example
{
  public static void main(String[] args)
  {
    System.out.println("Hello World!");
    http://Phi.Lho.free.fr

    System.exit(0);
  }
}

действительная программа Java (хотя она генерирует предупреждение). Если Вы не видите, почему, см. ответ Gregory!;-) ну, подсветка синтаксиса здесь также дает подсказку!

52
ответ дан PhiLho 23 November 2019 в 01:34
поделиться

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

List<Integer> ints = Arrays.asList(1,2,3);
56
ответ дан Bruno De Fraine 23 November 2019 в 01:34
поделиться

Используя этот ключевое слово для доступа к полям/методам содержания класса от внутреннего класса. В ниже, скорее изобретенный пример, мы хотим использовать sortAscending поле контейнерного класса от анонимного внутреннего класса. Используя ContainerClass.this.sortAscending вместо this.sortAscending добивается цели.

import java.util.Comparator;

public class ContainerClass {
boolean sortAscending;
public Comparator createComparator(final boolean sortAscending){
    Comparator comparator = new Comparator<Integer>() {

        public int compare(Integer o1, Integer o2) {
            if (sortAscending || ContainerClass.this.sortAscending) {
                return o1 - o2;
            } else {
                return o2 - o1;
            }
        }

    };
    return comparator;
}
}
53
ответ дан Tahir Akhtar 23 November 2019 в 01:34
поделиться

заключительная инициализация может быть отложена.

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

public Object getElementAt(int index) {
    final Object element;
    if (index == 0) {
         element = "Result 1";
    } else if (index == 1) {
         element = "Result 2";
    } else {
         element = "Result 3";
    }
    return element;
}
82
ответ дан 2 revs, 2 users 97% 23 November 2019 в 01:34
поделиться

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

при разработке нового языка (как в scala-случае) Вы сразу имеете все существующие библиотеки в наличии, и Ваш язык поэтому "полезен" с самого начала.

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

62
ответ дан Mo. 23 November 2019 в 01:34
поделиться

Несколько человек отправили об инициализаторах экземпляра, вот хорошее использование для него:

Map map = new HashMap() {{
    put("a key", "a value");
    put("another key", "another value");
}};

быстрый способ инициализировать карты, если Вы просто делаете что-то быстрое и простое.

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

JFrame frame = new JFrame();

JPanel panel = new JPanel(); 

panel.add( new JLabel("Hey there"){{ 
    setBackground(Color.black);
    setForeground( Color.white);
}});

panel.add( new JButton("Ok"){{
    addActionListener( new ActionListener(){
        public void actionPerformed( ActionEvent ae ){
            System.out.println("Button pushed");
        }
     });
 }});


 frame.add( panel );

, Конечно, этим можно злоупотребить:

    JFrame frame = new JFrame(){{
         add( new JPanel(){{
               add( new JLabel("Hey there"){{ 
                    setBackground(Color.black);
                    setForeground( Color.white);
                }});

                add( new JButton("Ok"){{
                    addActionListener( new ActionListener(){
                        public void actionPerformed( ActionEvent ae ){
                            System.out.println("Button pushed");
                        }
                     });
                 }});
        }});
    }};
89
ответ дан 3 revs, 3 users 75% 23 November 2019 в 01:34
поделиться

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

88
ответ дан 3 revs, 3 users 75% 23 November 2019 в 01:34
поделиться

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

public void foo(String... bars) {
   for (String bar: bars)
      System.out.println(bar);
}

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

104
ответ дан Paul Wicks 23 November 2019 в 01:34
поделиться

Мой фаворит: выведите все отслеживания стека потока к стандарту.

окна: CTRL - Повреждение в Вашем Java cmd/console Unix окна

: kill -3 PID

93
ответ дан 3 revs, 2 users 82% 23 November 2019 в 01:34
поделиться

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

Collections.<String,Integer>emptyMap()
121
ответ дан Kevin Wong 23 November 2019 в 01:34
поделиться

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

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

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

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

[еще 114] документация здесь .

134
ответ дан Adrian Mouat 23 November 2019 в 01:34
поделиться

Не видели, что любой упоминает instanceof, реализовываемый таким способом, которым проверка пустой указатель не необходима.

Вместо:

if( null != aObject && aObject instanceof String )
{
    ...
}

просто использование:

if( aObject instanceof String )
{
    ...
}
141
ответ дан Cadet Pirx 23 November 2019 в 01:34
поделиться

Передача управления в наконец блоке выбрасывает любое исключение. Следующий код не бросает 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
ответ дан 2 revs, 2 users 71% 23 November 2019 в 01:34
поделиться

Для большинства людей я беру интервью для положений 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
ответ дан 2 revs, 2 users 97% 23 November 2019 в 01:34
поделиться

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

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

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

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

можно назвать подкласс values метод и получить отсортированное ориентированное на многопотоковое исполнение Set из String s , не имея необходимость вниз бросать к ConcurrentSkipListSet.

144
ответ дан 2 revs 23 November 2019 в 01:34
поделиться

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

201
ответ дан Kevin Wong 23 November 2019 в 01:34
поделиться

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

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
ответ дан 5 revs, 2 users 99% 23 November 2019 в 01:34
поделиться

Совместное объединение в различии параметра типа:

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

, Например, если Вы хотели взять параметр, это и Сопоставимо и Набор:

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, если два данных набора равны или если любой из них содержит данный элемент, иначе ложь. Точка для замечания - то, что можно вызвать методы и Сопоставимого и Набор на аргументах b1 и b2.

279
ответ дан 5 revs, 2 users 94% 23 November 2019 в 01:34
поделиться

Это не точно "скрытые функции" и не очень полезное, но может быть чрезвычайно интересно в некоторых случаях:
Класс sun.misc. Небезопасный - позволит Вам реализовывать управление непосредственной памятью в Java (можно даже записать код Java самоизменения с этим при попытке много):

public class UnsafeUtil {

    public static Unsafe unsafe;
    private static long fieldOffset;
    private static UnsafeUtil instance = new UnsafeUtil();

    private Object obj;

    static {
        try {
            Field f = Unsafe.class.getDeclaredField("theUnsafe");
            f.setAccessible(true);

            unsafe = (Unsafe)f.get(null);
            fieldOffset = unsafe.objectFieldOffset(UnsafeUtil.class.getDeclaredField("obj"));
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    };
}
46
ответ дан Das 23 November 2019 в 01:34
поделиться

Мой голос переходит в java.util.concurrent с его параллельными наборами и гибкими исполнителями, позволяющими среди пулов потоков других, запланированных задач и скоординированных задач. DelayQueue является моим любимым, где элементы сделаны доступными после указанной задержки.

java.util. Таймер и TimerTask могут безопасно быть помещены в отдых.

кроме того, не точно скрытый, но в различном пакете от других классов, связанных до настоящего времени и время. java.util.concurrent. TimeUnit полезен при преобразовании между наносекундами, микросекундами, миллисекундами и секунды.

Это читает намного лучше, чем обычный someValue * 1000 или someValue / 1000.

38
ответ дан stili 23 November 2019 в 01:34
поделиться

я лично обнаружил java.lang.Void очень поздний - улучшает удобочитаемость кода в сочетании с дженериками, например, Callable<Void>

34
ответ дан Rahel Lüthy 23 November 2019 в 01:34
поделиться

Добавление цикла foreach создает в 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));

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

// 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
ответ дан 18Rabbit 23 November 2019 в 01:34
поделиться

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

37
ответ дан Binil Thomas 23 November 2019 в 01:34
поделиться

Уровень языка утверждает ключевое слово.

37
ответ дан Mark Cidade 23 November 2019 в 01:34
поделиться

Можно использовать перечисления для реализации интерфейса.

public interface Room {
   public Room north();
   public Room south();
   public Room east();
   public Room west();
}

public enum Rooms implements Room {
   FIRST {
      public Room north() {
         return SECOND;
      }
   },
   SECOND {
      public Room south() {
         return FIRST;
      }
   }

   public Room north() { return null; }
   public Room south() { return null; }
   public Room east() { return null; }
   public Room west() { return null; }
}

Править: Несколько лет спустя....

Я использую эту функцию здесь

public enum AffinityStrategies implements AffinityStrategy {

https://github.com/peter-lawrey/Java-Thread-Affinity/blob/master/src/main/java/vanilla/java/affinity/AffinityStrategies.java

При помощи интерфейса разработчики могут определить свои собственные стратегии. Используя enum средства я могу определить набор (пять) созданный в.

112
ответ дан 2 revs 23 November 2019 в 01:34
поделиться

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

new Object() {
  void foo(String s) {
    System.out.println(s);
  }
}.foo("Hello");
58
ответ дан 23 November 2019 в 01:34
поделиться

При работе в Swing мне нравится скрытая функция Ctrl - Shift - F1 .

Она выгружает компонент дерево текущего окна.
(Предполагая, что вы не связали это нажатие клавиши с чем-то другим.)

42
ответ дан 23 November 2019 в 01:34
поделиться

Подстановочные знаки пути к классам начиная с Java 6.

java -classpath ./lib/* so.Main

Вместо

java -classpath ./lib/log4j.jar:./lib/commons-codec.jar:./lib/commons-httpclient.jar:./lib/commons-collections.jar:./lib/myApp.jar so.Main

См. http://java.sun.com/javase/6/docs/technotes/tools/windows/classpath.html

173
ответ дан 23 November 2019 в 01:34
поделиться

Я знаю, что это было добавлено в выпуске 1.5, но новой перечислимый тип является замечательная особенность. Необходимость использовать старый "международный перечислимый шаблон" значительно помогла набору моего кода. JLS 8.9 Выезда для сладкого соуса на Вашем картофеле!

12
ответ дан Matt Cummings 23 November 2019 в 01:34
поделиться
Другие вопросы по тегам:

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