Допоможіть мені зрозуміти те, що я пропустив з Java 1.4.2 [закрито]


14

Я збираюся розпочати свою першу професійну кар'єру як розробник програмного забезпечення, і я, швидше за все, буду писати багато Java-коду. Я не знаю настільки багато про те, що конкретно я буду писати, і до того ж у мене є досить широкі інтереси, коли справа стосується коду.

З причин, які не варто обговорювати, в моєму останньому стажуванні було кодування лише для Java 1.3 та 1.4 SDK. Крім того, моя університетська освіта зосереджувалась головним чином на алгоритмах, структурах даних та іншій теорії, а не на мовних особливостях чи бібліотеках.

Отже, маючи на увазі вищесказане, які особливості, класи тощо в поточній версії Java (на якому номері ми все-таки працюємо?) Варті мого часу, щоб прочитати і чому? Що я пропустив з моменту 1.4.2, що полегшує вам життя програміста?

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


4
Які ці причини, про які не варто обговорювати? Багатьох із нас заінтригує ...
5аркс

@ 5arx Ну я працював з версією Java для програмування з робототехніки 1.4, тому що чомусь це підтримувала наша платформа.
Даніель Грацер

Відповіді:


15

Зміни, які я вважаю найважливішими:

  • Загальна інформація (наприклад, набрані колекції, як-от Set)

  • Покращено цикл (for (String s: set) {...})

  • Автобоксинг / розпакування (автоматично конвертувати між типами, такими як Integer, int та навпаки)

  • Перелітки Typesafe (enum - це тепер ключове слово, типи можна створити з переліків)

  • Вараги (для функції printf () дозволяє змінювати кількість аргументів)

  • Статичний імпорт (тепер можна імпортувати статичні методи класу, наприклад, java.lang.Math)

  • Анотації

  • java.util.concurrent (демонструє паралельність Java)

Читайте також, на яку Java ви прагнете? , щоб краще зрозуміти кожну з трьох версій.


1
++ покращений цикл, автобоксинг / розпакування, varargs, статичний імпорт прості
Michael Wiles

Чому програмісти Java називають для кожного циклу "розширені forпетлі?"
Maxpm

2
@Maxpm Тому, що так називається в специфікації мови Java. Відповідно до JLS, існують основні для циклів і розширені для циклів. Я не впевнений, чому вони вирішили зробити це саме так. Можливо тому, що синтаксис не використовує спеціального ключового слова та свого роду сумішей із звичайними петлями.
Малькольм

10

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

Generics - це механізм, який дозволяє, наприклад, Listмістити рядки замість оголених об'єктів, де компілятор примушує виводити елемент до списку - це String, і він знає, що коли ви отримуєте елемент зі списку, це String .

Це сприяє кращим програмам, оскільки ви уникаєте явного перегляду часу виконання цільового типу (що є частим джерелом помилок, якщо ви помилитесь), і IDE може допомогти вам виконати всю брудну роботу, оскільки вона знає набагато більше про ваш код, ніж це робилося, коли це був лише перелік об’єктів.

Джошуа Блох написав хороший вступ до Generics, який доступний як зразок глави на http://java.sun.com/docs/books/effective/


Будь ласка, НЕ кажіть Groovy людям! "Це робить кращими програми, оскільки ви уникаєте передачі часу на цільовий тип." def whatever....
Дан Розенстарк

@Yar, відредагований так, щоб бути більш чітким. Я люблю атрибут "def" або "var". Зробило б моє життя трохи простіше.

Так, я нещодавно думав про це нещодавно з Objective-C і тим, idщо є defабо var.... але знову ж таки, безпека 100% статичного набору тексту дивовижна, справді.
Дан Розенстарк

@Yar: Вам сподобається Ада :)
mattnz

@mattnz чому, зокрема? І поки ми тут, чи працює він на JVM?
Дан Розенстарк

6

Автобоксинг - це приємна функція, представлена ​​Java 5. Так само, як і в C #, компілятор зараз робить автоматичне перетворення між примітивними (базовими) типами та відповідними класами обгортки об'єктів (int to Integer і т.д.) і назад. Це робить роботу з Java Collections набагато менше болю.

Бо я вважаю, що кожна петля була нова в Java 5 теж. Це полегшує ітерацію над масивами (і колекціями), оскільки вона виключає велику частину звичайного скупчення, пов’язаного з налаштуванням та управлінням змінної індексу або ітераторів. Наприклад:

void myMethod(Collection<myObjectType> c) {
    for (myObjectType o : c)
        o.foo();
}

6

Перелічує , щоб замінити остаточну статику та константи та допоможе вам видалити посилання на рядки та магічні числа. Приклад, взятий від добрих людей при сонці / оракулі :

public enum Planet {
    MERCURY (3.303e+23, 2.4397e6),
    VENUS   (4.869e+24, 6.0518e6),
    EARTH   (5.976e+24, 6.37814e6),
    MARS    (6.421e+23, 3.3972e6),
    JUPITER (1.9e+27,   7.1492e7),
    SATURN  (5.688e+26, 6.0268e7),
    URANUS  (8.686e+25, 2.5559e7),
    NEPTUNE (1.024e+26, 2.4746e7),
    PLUTO   (1.27e+22,  1.137e6);

    private final double mass;   // in kilograms
    private final double radius; // in meters
    Planet(double mass, double radius) {
        this.mass = mass;
        this.radius = radius;
    }
    public double mass()   { return mass; }
    public double radius() { return radius; }

    // universal gravitational constant  (m3 kg-1 s-2)
    public static final double G = 6.67300E-11;

    public double surfaceGravity() {
        return G * mass / (radius * radius);
    }
    public double surfaceWeight(double otherMass) {
        return otherMass * surfaceGravity();
    }
}

і

public static void main(String[] args) {
        double earthWeight = Double.parseDouble(args[0]);
        double mass = earthWeight/EARTH.surfaceGravity();
        for (Planet p : Planet.values())
           System.out.printf("Your weight on %s is %f%n",
                             p, p.surfaceWeight(mass));
    }

6

java.util.concurrent було введено в 1.5. Найкращий ресурс для її вивчення - це (мабуть) книга « Конкурс Java в практиці» . Паралельність IMHO - найважливіша конкурентна перевага Java в порівнянні з будь-яким іншим, тому її, безумовно, варто добре знати.


1
+1 Для згадування про одночасний пакет. Прикро, що так багато розробників досі використовують примітивні параметри, як Threads, wait () / notify () та синхронізують, ...
Oliver Weiler

Справді. java.util.concurrentсумісність примітивів - це як автоматичне управління пам'яттю, так і ручне управління пам'яттю. Використання останнього є лише рецептом витрачати більше часу на налагодження і не дає переваг.
Joonas Pulakka

Виконавці на допомогу! Ще краще на Java 6

+1000, якщо я міг - ця книга дивовижна
Гері Роу

4

Ну, StringBuilderдопомогли мені прискорити свою програму. Це еквівалент StringBufferбезпеки без різьби.


Так. Ефективна Java заявляє, що StringBuffer є застарілим і його слід замінити StringBuilder.
Гері Роу

1
При +об'єднанні рядків автоматично використовуйте StringBuilder замість StringBuffer для рівня джерела 1.5 і вище.

4

Я допоможу, класифікуючи корисну відповідь від @ykombinator. Його список - це перелік елементів, якими ви будете користуватися щодня, роблячи «загальну» розробку Java.

Низький вплив та низька складність:

  • Покращено цикл (for (String s: set) {...})
  • Автобоксинг / розпакування (автоматично конвертувати між типами, такими як Integer, int та навпаки)
  • Вараги (для функції printf () дозволяє змінювати кількість аргументів)
  • Статичний імпорт (тепер можна імпортувати статичні методи класу, наприклад, java.lang.Math)

Високий вплив та середня складність:

  • Перелітки Typesafe (enum - це тепер ключове слово, типи можна створити з переліків)

Високий вплив та велика складність:

  • Анотації
  • Дженріки

Низький удар і дуже складний (використовуватимуться лише в тому випадку, якщо ви не зробите вдосконалену різьбу)

  • java.util.concurrent (демонструє паралельність Java)

Тому я б запропонував вам прочитати документи / довідку щодо низьких складних низько складних творів - їх легко підібрати. Витратьте достатньо часу на Анотації та Генерики - анотації є дуже корисними, а загальна інформація може стати досить складною.

Подивіться на новий вміст одночасності, якщо вам потрібно зайнятися нанизуванням.


4

Оскільки я не можу коментувати, оскільки мені менше 50, я залишу відповідь. Про це вже згадувалося, але я повторю ще раз: Анотації! Цей вид метаданих став найважливішим моїм досвідом роботи на Java. Він добре використовується, як і деякі рамки, але це робить код набагато більш стисним та чистим. Наприклад, примітки можуть:

  • Перетворіть об'єкт у сутність @Entity
  • Перетворіть метод у послугу REST @GET
  • Поясніть, що метод ніколи не поверне null @nonnull
  • Встановіть об’єкт у поле для введення залежності @inject

І звичайно, ви можете створювати власні анотації та знати, чи метод, клас чи поле позначається за допомогою відображення.


2
Якщо точні анотації зробити це не вдається , оскільки вони просто вводять метаінформацію в код, над яким інший код - часто це спеціальний завантажувач класів - може вжити заходів. Я вважаю анотації дуже хорошим загальним вирішенням багатьох проблем.

3

Навчання на прикладі працює для мене

Ось короткий приклад ідіоматичної Java 6

public class Main {
  public static void main(String[] args) {
    // Shows a list forced to be Strings only
    // The Arrays helper uses generics to identify the return type
    // and takes varargs (...) to allow arbitary number of arguments
    List<String> genericisedList = Arrays.asList("A","B","C");

    // Demonstrates a for:each loop (read as for each item in genericisedList)
    for (String item: genericisedList) {
      System.out.printf("Using print formatting: %s%n",item);
    }

    // Note that the object is initialised directly with a primitive (autoboxing)
    Integer autoboxedInteger = 1;
    System.out.println(autoboxedInteger);

  }
}

Не турбуйтеся з Java5, вона відносно Java6 застаріла.

Наступний крок, анотації. Вони просто визначають аспекти вашого коду, які дозволяють читачам анотацій заповнити конфігурацію котла для вас. Розглянемо простий веб-сервіс, який використовує специфікацію JAX-RS (він розуміє RESTful URI). Ви не хочете турбуватися робити всі противні WSDL та спілкуватися з Axis2 тощо, ви хочете швидкого результату. Правильно, зробіть це:

// Response to URIs that start with /Service (after the application context name)
@Path("/Service")
public class WebService {

  // Respond to GET requests within the /Service selection
  @GET
  // Specify a path matcher that takes anything and assigns it to rawPathParams
  @Path("/{rawPathParams:.*}")
  public Response service(@Context HttpServletRequest request, @PathParam("rawPathParams") String rawPathParams) {
    // Do some stuff with the raw path parameters 

    // Return a 200_OK
    return Response.status(200).build();
  }
}

Вибух. Трохи посипавши магію конфігурації у своєму web.xml, ви вимкнетесь. Якщо ви будуєте з Maven і у вас налаштований плагін Jetty, ваш проект буде мати власний маленький веб-сервер прямо з коробки (не маніпулюючи з JBoss або Tomcat для вас), і вищевказаний код відповість на URIs форма:

GET http://localhost:8080/contextName/Service/the/raw/path/params

Робота виконана.


3

Нічого собі, це був вибух з минулого! Я не користувався Java вже 4 роки - і нічого взагалі не змінилося за той час!

Існує перелік функцій за версією , але ось важливий біт (звичайно плагіат) ...

J2SE 5.0 (30 вересня 2004 р.)

  • Generics: Забезпечує безпеку для колекцій у часі компіляції (статичний) та виключає потребу в більшості типів (перетворення типів).
  • Метадані: також називаються анотаціями; дозволяє мовні конструкції, такі як класи та методи, позначати додатковими даними, які потім можуть бути оброблені утилітами, що обізнані з метаданими.
  • Автобоксинг / розпакування: Автоматичні перетворення між примітивними типами (наприклад, int) та класами примітивних обгортків (наприклад, Integer).
  • Перерахування: ключове слово enum створює безпечний тип, упорядкований список значень (наприклад, Day.MONDAY, Day.TUESDAY тощо). Раніше цього можна було досягти лише за допомогою постійних цілих чисел, що не належать до типу, або ж вручну побудовані класи (typesafe enum pattern).
  • Гойдалка: Новий зовнішній вигляд шкіри, що називається synth.
  • Вараги: Останній параметр методу тепер може бути оголошений за допомогою імені типу, за яким слідують три крапки (наприклад, недійсний малюнок тексту (рядок ... рядки)). У коді виклику може використовуватися будь-яке число параметрів цього типу, і вони потім поміщаються в масив, який передається методу, або, як альтернатива, код виклику може передавати масив цього типу.
  • Покращений для кожного циклу: Синтаксис for циклу розширюється спеціальним синтаксисом для ітерації над кожним членом масиву або будь-якого Iterable, наприклад стандартних класів Collection, використовуючи конструкцію форми:

Java SE 6 (11 грудня 2006 р.)

  • Підтримка старих версій Win9x знизилася. Неофіційно Java 6 Update 7 - це останній випуск Java, показаний для роботи на цих версіях Windows. Вважається, що це пов'язано з основними змінами в оновлення 10.
  • Підтримка мови скриптів: Загальний API для тісної інтеграції з мовами скриптів та вбудована інтеграція Mozilla JavaScript Rhino
  • Драматичні покращення продуктивності для основної платформи та Swing.
  • Покращена підтримка веб-служб через JAX-WS
  • Підтримка JDBC 4.0.
  • API Java Compiler API, що дозволяє програмі Java вибирати та викликати Java Compiler програмно.
  • Оновлення JAXB до версії 2.0: включаючи інтеграцію аналізатора StAX.
  • Підтримка підключаються приміток
  • Багато вдосконалень графічного інтерфейсу, такі як інтеграція SwingWorker в API, сортування та фільтрування таблиць та справжнє подвійне буферування Swing (усуваючи ефект сірої області).
  • Вдосконалення JVM включають: оптимізацію продуктивності синхронізації та компілятора, нові алгоритми та оновлення існуючих алгоритмів збору сміття та продуктивність запуску програми.

Ось про це. Java SE 7.0 виглядає цікавіше, але поки не виходить.

З огляду на те, скільки нових мовних функцій та API було додано до C # за останні 4 роки, я дуже вражений. Що відбувається в Sun / Oracle?


Sun вирішила відкрити вихідний код Java. Це річ , яка забезпечує , що незалежно від того, що Oracle вирішує зробити ми ще можемо запустити OpenJDK на коробках Linux. Це затримало їх лише на 18-24 місяці ...

@ Thorbjørn - це може пояснити це. Прикро, скільки зривів спричинило це придбання. Я думаю, що C # користується порівняльною стабільністю: у нас лямбда з 2006 року - де вони виглядають так, ніби вони не потраплять на Java до 2012 року.
sheikhjabootie
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.