Ява: Долой Старое, Новым - PullRequest
65 голосов
/ 03 ноября 2008

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

Каковы некоторые типовые ситуации с кодом, особенно те, которые, как вы видите, люди реализуют по привычке, и которые вы реорганизуете, чтобы использовать последние версии Java?

Ответы [ 30 ]

70 голосов
/ 03 ноября 2008

Перечисления. Замена

public static final int CLUBS = 0;
public static final int DIAMONDS = 1;
public static final int HEARTS = 2;
public static final int SPADES = 3;

с

public enum Suit { 
  CLUBS, 
  DIAMONDS, 
  HEARTS, 
  SPADES 
}
45 голосов
/ 03 ноября 2008

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

EDIT:

До:

List l = someList;
Iterator i = l.getIterator();
while (i.hasNext()) {
    MyObject o = (MyObject)i.next();
}

* После 1008 *

List<MyObject> l = someList;
for (MyObject o : l) {
    //do something
}
37 голосов
/ 03 ноября 2008

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

35 голосов
/ 30 мая 2009

чтение строки из стандартного ввода:

Java pre-5 :

try {
    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    String str = reader.readLine();
    reader.close();
}
catch (IOException e) {
    System.err.println("error when closing input stream.");
}

Java 5 :

Scanner reader = new Scanner(System.in);
String str = reader.nextLine();
reader.close();

Java 6 :

Console reader = System.console();
String str = reader.readLine();
24 голосов
/ 03 ноября 2008

Более старый код, использующий Thread вместо множества других альтернатив Thread ... в наши дни очень мало кода, с которым я работаю, все еще нуждается в использовании необработанного потока. Им бы лучше обслуживался уровень абстракции, в частности Callable / Futures / Executors .

См:

java.util.Timer

javax.swing.Timer

java.util.concurrent. *

24 голосов
/ 03 ноября 2008

Вот один, который я вижу:

String.split() против StringTokenizer.

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

Что касается совместимости, Sun прилагает огромные усилия для обеспечения обратной и прямой совместимости Java. Это частично объясняет, почему генерики настолько сложны. Предполагается, что устаревание также поможет облегчить переход от старого к новому коду.

21 голосов
/ 04 ноября 2008

VARARGS тоже могут быть полезны.

Например, вы можете использовать:

public int add(int... numbers){
    int sum = 0 ;
    for (int i : numbers){
        sum+=i;
    }
    return sum ;
}

вместо:

public int add(int n1, int n2, int n3, int n4) ;

или

public int add(List<Integer> numbers) ;
17 голосов
/ 03 ноября 2008

Использование локальных переменных типа Vector для хранения списка объектов. Если синхронизация не требуется, теперь рекомендуется использовать реализацию List, такую ​​как ArrayList, поскольку этот класс обеспечивает лучшую производительность (поскольку он не синхронизирован).

16 голосов
/ 09 марта 2009

Форматированная печать была представлена ​​еще в JDK 1.5. Поэтому вместо использования:

String str = "test " + intValue + " test " + doubleValue;

или эквивалент с использованием StringBuilder,

можно использовать

String str = String.format("test %d test %lg", intValue, doubleValue);

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

15 голосов
/ 03 ноября 2008

Явное преобразование между типами примитивов и типов-оболочек (например, Integer в int или наоборот), которое выполняется автоматически при автоматической коробке / распаковке начиная с Java 1.5.

Примером является

Integer myInteger = 6;
int myInt = myInteger.intValue();

Можно просто записать как

Integer myInteger = 6;
int myInt = myInteger;

Но следите за исключениями NullPointerException:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...