вторник, 7 октября 2014 г.

Java 8 Help

Наименования

Разрешается начинать наименования с символа $ и _

Допустимые наименования

class TestDriver {...}
String testVariable;
int _testVariable;
Long $testVariable;
startTest(testVariable1);

Class Names

Имена классов должны быть существительными, описывающим вещи или объекты, написанными в формате camelCase с заглавной первой буквой.

public class Fish {
   ...
}

Interface Names

Имена интерфейсов должны быть прилагательными, оканчивающимися на "able" или "ible", если интерфейс предоставляет какие-либо возможности, в противном случае они должны быть существительными.

public interface Serializable {
   ...
}


public interface SystemPanel {
   ...
}

Method Names

Имена интерфейсов должны быть глаголами, так как они заставляют объект выполнять какое-либо действие, написанными в формате camelCase с прописной первой буквой. Сущесвительные и прилагательные могут входить в состав имени метода.

public void locate () {}
public String getWayPoint () {}

Instance and Static Variable Names

Имена объектов и статичных переменных должны быть существительными, написанными в формате camelCase с прописной первой буквой.

private String wayPoint;

Parameter and Local Variable Namse

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

public void printHotSpots (ArrayList spotList) {
    int counter = 0;
    for (String hotSpot : spotList) {
        System.out.println('Hot Spot #' + ++counter + ': ' + hotSpot);
    }
}

Временные переменные могут быть просто буквами: i, j, k, m, n - для чисела и c, d, e - для букв.

Generic Type Parameter Names

Параметры джинериков должны быть заглавными буквами.
T - используется для указания типа.
E - используется для коллекции элементов.
S - используется для сервисов загрузчиков.
K и V - используются для указания типа key (ключа) и value (значения) в массивах.

public interface Map <K, V> {
    V put(K key, V value);
}

Constant Names

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

public static final int MAX_DEPTH = 200;

Enumeration Names

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

enum Battery {CRITICAL, LOW, CHARGED, FULL}

Packages Names

Имена пакетов (модулей) должны быть уникальными и состоять из прописных букв. Для разделения слов в названиях допускается также использовать символ подчеркивания. Названия публичных пакетов должны представлять из себя перевернутый интернет адрес. Запрещено начинать имя пакета со слов java и javax.

package com.oreilly.fish_finder;

Annontation Names

Имена анотаций могут быть связками прилагательного с существительным или глагола с существительным.

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface FunctionalInterface {}

Acronims

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

public String getGpsVersion () {}

Comments

Вложенные многострочные комментарии недопустимы.

// Однострочный комментарий

/*
 * Многострочный
 * комментарий
 */

/** Комментарий в формате Javadoc */

Keywords

Зарезервированные слова:

abstract double int super
assert else interface switch
boolean enum long synchronized
break extends native this
byte final new throw
case finally package throws
catch float private transient
char for protected try
class if public void
const goto return volatile
continue implements short while
default import static
do instanceof strictfp

Зарезервированные литералы

true false null

Literals

boolean isReady = true;
char charValue = 'a';
int intValue = 123; // 1_2_3 в Java 7
public static final int INT_VALUE = 123; // константа
float floatValue = 0.15;
double doubleValue = 0.15;
String stringValue = 'Valid.\nOn new line.';
Strung n = null;

Escape Sequences

Backspace - \b
Horizontal tab - \t
Line feed - \n
Form feed - \f
Carriage return - \r
Double quote - \"
Single quote - \'

Primitive Types

boolean: true or false
char: Unicode character
byte: –128 to 127
short: –32768 to 32767
int: –2147483648 to 2147483647
long: –2^63 to 2^63 –1
float: 1.4e^–45 to 3.4e^+38
double: 5e^–324 to 1.8e^+308

Floating-Point Entities

Infinity
–Infinity
–0.0
NaN

Double.POSITIVE_INFINITY; // Infinity
Float.POSITIVE_INFINITY; // Infinity
Double.NEGATIVE_INFINITY; // –Infinity
Float.NEGATIVE_INFINITY; // –Infinity
Double.NaN; // Not-a-Number
Float.NaN; // Not-a-Number

Double.isFinite(Double.POSITIVE_INFINITY); // false
Double.isFinite(Double.NEGATIVE_INFINITY); // false
Double.isFinite(Double.NaN); // false
Double.isFinite(1); // true
Double.isInfinite(Double.POSITIVE_INFINITY); // true
Double.isInfinite(Double.NEGATIVE_INFINITY); // true
Double.isInfinite(Double.NaN); // false
Double.isInfinite(1); // false
Double.isNaN(Double.NaN); // true
Double.isNaN(1); // false

Unary Numeric Promotion

Если тип операнда byte, short или char, то тип будет повышен до int, в противном случае тип не будет изменен.

Binary Numeric Promotion

Если тип операнда double, то не-double примитив будет конвертирова в double.

Если тип операнда float, то не-float примитив будет конвертирова в float.

Если тип операнда long, то не-long примитив будет конвертирова в long.

В противном случае оба операнда будут конвертированы в int.

Special Cases for Conditional Operators

Если операнд типа short и другой оператор типа short, то условное выражение будет типа short.

short = true ? byte : short

Wrapper Classes

boolean - booleanValue()

char - charValue()

byte - byteValue(), shortValue(), intValue(), longValue(), floatValue(), doubleValue()

short - byteValue(), shortValue(), intValue(), longValue(), floatValue(), doubleValue()

int - byteValue(), shortValue(), intValue(), longValue(), floatValue(), doubleValue()

long - byteValue(), shortValue(), intValue(), longValue(), floatValue(), doubleValue()

float - byteValue(), shortValue(), intValue(), longValue(), floatValue(), doubleValue()

double - byteValue(), shortValue(), intValue(), longValue(), floatValue(), doubleValue()

Arrays

int[] luckyNumbers = new int[] {7, 13, 21};

Сравнение ссылок на объекты.

Guest guest1 = new Guest("name");
Guest guest2 = guest1;
if (guest1 == guest2) {
    System.out.println("They are equal");
}

Guest guest3 = new Guest("name");
Guest guest4 = new Guest("name");
if (guest3 == guest4) {
    System.out.println("They are equal.");
else {
    System.out.println("They are not equal");
}

Сравнение самих объектов.

class MyComparisons {
    String first = "chairs"; // Add string to pool
    String second = "chairs"; // Use string from pool
    String third = new String ("chairs"); // Create a new string
    void myMethod() {
        // Contrary to popular belief, this evaluates to true. Try it!
        if (first == second) {System.out.println("first == second");}
        // This evaluates to true
        if (first.equals(second)) {System.out.println("first equals second");}
        // This evaluates to false
        if (first == third) {System.out.println("first == third");}
        // This evaluates to true
        if (first.equals(third)) {System.out.println("first equals third");}
    }
}

Объекты класса String неизменяемы.
Объекты классов StringBuffer и StringBuilder изменяемы.

Перечисления можно сравнивать как с помощью ==, так и с помощью метода equals().
Результат будет одинаков.

Клонирование объектов.

Для клонирования объекта класс должен имплементировать интерфейс Cloneable,
защищенный метод clone() должен позволить объектам клонировать самих себя,
для объектов, копирующих другие объекты, метод clone() должен быть переписан и сделан публичным,
во время клонирования может быть выброшена ошибка CloneNotSupportedException.

Поверхностное и глубокое клонирование объекта.

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

Class Song {
    String title;
    Artist artist;
    float length;
    int year;
    void setData() {...}
}

Song firstSong = new Song();

try {
    Song leadingSong = (Song)firstSong.clone(); // Make an actual copy by cloning
} catch (CloneNotSupportedException cnse) {
    cnse.printStackTrace();
}

При глубоком клонировании примитивные данные копируются и из оригинального объекта рекурсивно
копируются все содержащиеся в нем объекты.

Java не имеет встроенного метода для глубокого клонирования объектов. Программист должен создать его самостоятельно.

Альтернативой клонирования является копирование конструкторов и сериализация, которая применяется чаще.

Объектно-ориентированное программирование в Java включает классы, объекты и интерфейсы.

Классы представляют собой объекты реального мира. Они содеражат набор данных и набор методов для манипулирования этими данными.
Экзепляр класса называется объектом. Классы могут наследовать наборы данных и методов друг от друга.
Класс может одновременно наследовать данные только от одного класса.
Внутренние данные класса должны быть private и доступны вне класса только через public методы геттеры и сеттеры.

public class className
extends parentSuperClass
implements someInterfaces separated by commas {
    // Data member(s) // private type dataMemberName = 1;
    // Constructor(s)
    // Method(s) // public type methodName (parameterList) throws listOfExceptionsSeparatedByCommas {// Method body}
}

className myObject = new className();

Overloading

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

public class VotingMachine {
    ...
    public void startUp () {...}
    private void startUp (int delay) {...}
    private String startUp (District d) throws new IOException {...}
}

Методы родительского класса могут быть переписаны в дочернем классе.
Могут быть переписаны только методы не имеющие final, private, static.
Protected методы могут переписывать методы без указания уровня доступа.
Переписываемый метод не может иметь более строгий параметр доступа, такой как
package, public, private, protected, нежели оригинальный метод.
Переписывамый метод не может выбрасывать никакое новое исключение.

public class Display {
    void startUp () {System.out.println("Using base display.");}
}

public class TouchScreenDisplay extends Display {
    void startUp () {System.out.println("Using new display.");}
}

Constructors

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

public class Candidate {
    ...
    Candidate(int id) {
        this.identification = id;
    }
    Candidate(int id, int age) {
        this.identification = id;
        this.age = age;
    }
}
// Create a new Candidate and call its constructor
Candidate candidate = new Candidate(id);

Родительский суперкласс и дочерний сабкласс.

Сабкласс не имеет доступа к private данным и методом родительского суперкласса, но имеет доступ к public и protected данным и методом родительского суперкласса. Однако через геттеры и сеттеры дочерний класс может получить доступ к private данным родительского класса.

Для доступа к данным и методам родительского класса используется ключевое слово super.

public class PrivacyWall {
    public void printSpecs() {...}
}

public class Curtain extends PrivacyWall {
    public void printSpecs() {
        ...
        super.printSpecs();
    }
}

Слово super используется также для вызова ноструктора родительского класса внутри дочернего класса.
Но вызов конструктора родительского лкасса должены быть первой строкой внутри конструктора дочернего класса.

public PrivacyWall(int l, int w) {
    int length = l;
    int width = w;
}

public class Curtain extends PrivacyWall {
    // Set default length and width
    public Curtain() {
        super(15, 25);
    }
}

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

Ключевое слово this используется для доступа к данным внутри конкретного объекта и для вызова конструктора внутри другого консруктора одного и того же класса, а также для передачи ссылки на текущий объект другому объекту.

public class Curtain extends PrivacyWall {
    String color;
    public void setColor(String color) {
        this.color = color;
    }
}

public class Curtain extends PrivacyWall {
    public Curtain(int length, int width) {}
    public Curtain() {
        this(10, 9); // Вызов верхнего конструктора внутри данного класса.
    }
}

// Print the contents of class curtain
System.out.println(this);
public class Builder {
    public void setWallType(Curtain c) {...}
}

Переменное число однотипных аргуметнов в методах появилось начиная с Java 5.0.
varargs параметр могжет быть заданы только последним аргументом в методе.
В методе переменное число параметром обозначается троеточием (...)

public setDisplayButtons (int row, String... names) {}

Компилятором данный метод будет преобразован в такой

public setDisplayButtons (int row, String [] names) {}

Допустимо, если у метода будет только один vararg параметр.

// Zero or more rows
public void setDisplayButtons (String... names) {}

setDisplayButtons("Jim");
setDisplayButtons("John", "Mary", "Pete");
setDisplayButtons("Sue", "Doug", "Terry", "John");

Переменным может быть только последний аргумент в методе.

Abstract Classes and Abstract Methods

Абстрактный класс не создает объектов. Он может содержать абстрактные и необстрактные методы,
а также быть подклассом как абстрактного, так и не абстрактного класса.
Все абстрактные методы должны быть определены классом потомкома, если только потом тоже не является асбтрактным классом.

Абстрактный метод содержит только объявление имени метода, которые затем должен быть определен неабстрактным методом в классе потомке.

public abstract class Alarm { // абстрактный класс
    public void reset() {...}
    public abstract void renderAlarm(); // абстарктный метод
}

public class DisplayAlarm extends Alarm {
    public void renderAlarm() {
        System.out.println("Active alarm.");
    }
}

Static Data Members, Static Methods,
Static Constants and Static Initializers

Статичные свойства, методы, константы и инициализаторы класса выполняются без создания объекта - экземпляра класса.

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

public class Voter {
    static int voterCount = 0;
    public Voter() { voterCount++;}
    public static int getVoterCount() {
        return voterCount;
    }
}

int numVoters = Voter.voterCount;

Статичные методы не могут иметь доступа к нестатичным методам и переменым класса, поскольку они ассоциированы с сами классом, а не
с создаваемым им объектом.

// Declaring a static method
class Analyzer {
    public static int getVotesByAge() {...}
}

// Using the static method
Analyzer.getVotesByAge();

Статичные константы неизменяемы.

// Declaring a static constant
static final int AGE_LIMIT = 18;
// Using a static constant
if (age == AGE_LIMIT) {newVoter = "yes";}

Статичные инициализаторы представляют из себя блок кода со словом static. Эти блоки кода выполняются только один раз при каждом создании классом объекта. Статичные блоки кода выполняются по порядку их расположения в классе. Каждый класс может иметь неограниченное количество
статичных инициализаторов.

// Static Initializer
static {
    numberOfCandidates = getNumberOfCandidates();
}

Interfaces
Интерфейсы представляют из себя набор публичных методов, не имеющих тел.
Класс, который имплементирует интерфейс, должен описать все методы, перечисленные в интерфейсе, или они должны быть записаны в нем как абстрактные.
Имена интерфейсов обычно представляют из себя прилагательные с окончаниями "able" и "ible".

interface Reportable {
    void genReport(String repType);
    void printReport(String repType);
}

class VotingMachine implements Reportable {
    public void genReport (String repType) {
        Report report = new Report(repType);
    }
    public void printReport(String repType) {
        System.out.println(repType);
    }
}

Классы могут использовать несколько интерфейсов, а интерфейсы могут расширять несколько классов.

Enumerations

Перечисления - это списки объектов, которые представляют из себя набор опций для выбора. Таким образом перечисление - это класс типа enum,
являющийся сингтоном. Классы перечислений могут иметь методы, конструкторы и свойства.

enum DisplayButton {ROUND, SQUARE}
DisplayButton round = DisplayButton.ROUND;

enum DisplayButton {
    // Size in inches
    ROUND (.50f),
    SQUARE (.40f);
    private final float size;
    DisplayButton(float size) {this.size = size;}
    private float size() { return size; }
}

for (DisplayButton b : DisplayButton.values()) {System.out.println("Button: " + b.size());}

Annotation Types

Аннотации позволяют ассоциировать метаданные (данные о данных) с программными элементами в процесс компиляции и работы программы.
Packages, classes, methods, fields, parameters, variables и constructors могут иметь аннотации.
Аннотации позволяют получить метаданные о классе.
Аннотации должны быть помещены перед анотируемым предметом.
Аннотации возвращают примитивные занчения, перечисления, класс String, класс Class, другие аннотации и массивы.

Примеры аннотаций.

@Override - помечает, что метод родительского класса переписан.
@Deprecated - помечает, что устаревшое API использовано или переписано.
@Suppress - предупреждение о том, что здесь выборочно подавляется вывод предупреждений.

@Override
public String toString() {
    return super.toString() + " more";
}

Программисты могут определять свои аннотации.

@Retention(RetentionPolicy.RUNTIME)
public @interface Feedback {} // Marker
public @interface Feedback {
    String reportName();
}
// Single value
public @interface Feedback {
    String reportName();
    String comment() default "None";
}
// Multi value
@Feedback(reportName="Report 1")
public void myMethod() {...}

Программисты могут полуать значения аннотаций с помощью метода getAnnotation()

Feedback fb = myMethod.getAnnotation(Feedback.class);

Аннотации могут  быть записаны с родительским классом, имплементировать интерфесы, interfaces, casts, instanceof checks, exception
specifications, wildcards, method references, and constructor references.

Functional Interfaces

Интерфейсы функций - это одиночные абстарктные методы (SAM), то есть интерфейсы, которые определяют единственный абстарктный метод.
Аннотация @FunctionalInterface может быть помещена перед декларацией такого интерфейса.

@FunctionalInterface public interface InterfaceName {
    public void doAbstractTask();  // Only one abstract method allowed
    // Multiple default methods allowed
    default public void performTask1(){
        System.out.println("Msg from task 1.");
    }
    default public void performTask2(){
        System.out.println("Msg from task 2.");
    }
}

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

Blocks

Код записанный внутри блока {} видим только внутри него. Блоки выполняются по порядку их записи в коде.

static {
    GigSimProperties.setFirstFestivalActive(true);
    System.out.println("First festival has begun");
    gigsimLogger.info("Simulator started 1st festival");
}

Условия if - else if - else

if (numOfSongs <= 24) {System.out.println("Do not book");
} else if ((numOfSongs > 24) & (numOfSongs < 50)){System.out.println("Book for one night");
} else if ((numOfSongs >= 50)) {System.out.println("Book for two nights");
} else {System.out.println("Book for the week");
}

Switch

switch может обрабатывать char, byte, short, int,Character, Byte, Short, Integer, Integer
wrapper types; enumeration types; String type.

String style;
String guitarist = "Eric Clapton";
switch (guitarist) {
case "Chet Atkins":
    style = "Nashville sound";
    break;
case "Thomas Emmanuel":
    style = "Complex fingerstyle";
    break;
default:
    style = "Unknown";
    break;
}

For

for (int i=0; i<bArray.length; i++) {
    System.out.println(bArray[i].getManufacturer());
}

ForEach in Array

for (ElectricGuitar event : eList) {
    System.out.println("Name:" + event.getName());
}

While

int bandMembers = 5;
while (bandMembers > 3) {
    CoffeeShop c = new CoffeeShop();
    c.performGig(bandMembers);
    Random generator = new Random();
    bandMembers = generator.nextInt(7) + 1; // 1-7
}

Do - While

int bandMembers = 1;
do {
    CoffeeShop c = new CoffeeShop();
    c.performGig(bandMembers);
    Random generator = new Random();
    bandMembers = generator.nextInt(7) + 1; // 1-7
} while (bandMembers > 3);

Label, Break, Continue

playMeasures:
while (isWithinOperatingHours()) {
    while (measure <= lastMeasure) {
        if (guitar.checkForBrokenStrings()) {
            break playMeasures;
        }
        song.playMeasure(measure);
        measure++;
    }
} // exits to here

for (int i=0; i<25; i++) {
    if (playList.get(i).isPlayed()) {continue;
    } else {song.playAllMeasures();
    }
}

Return

private int numberOfFrets = 18; // default
...
public int getNumberOfFrets() {
    return numberOfFrets;
}

Assert

Assert выполняет выражение и возвращает Boolean значение для того, чтобы проверить код в режиме отладки debug.

assert boolean_expression : errorcode;

// Show invalid 'stringed instruments' strings value
assert (strings == 12 || (strings >= 4 && strings <= 8)) : "Invalid string count: " + strings;

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

Checked Exception

// Method declaration that throws an IOException
void readFile (Stirng filename) throw IOException {
    ...
    throw new IOException();
    ...
}

// Catch an exception
public void methodB() {
    ...
    /* Call to methodA must be in a try/catch block
    ** since the exception is a checked exception;
    ** otherwise methodB could throw the exception */
    try {
        methodA();
    } catch (IOException ioe) {
        System.err.println(ioe.getMessage());
        ioe.printStackTrace();
    }
}

Try - catch - finally - throw

Блок Try обязательно должен иметь хотя бы 1 блок catch или finally.
Блок Catch никогда не должен быть пустым.

if (n == -1) {
    throw new EOFException();
}

try {
    method();
} catch (EOFException eofe) {
    eofe.printStackTrace();
} catch (IOException ioe) {
    ioe.printStackTrace();
} finally {
    // cleanup
}

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

catch (ArrayIndexOutOfBoundsException aioobe) {
    aioobe.printStackStrace();
}

Внутри блока Catch может быть выброшено новое исключение.

Try - Finally

Блок Finally будет выполнен всегда независимо от того было ли вызвано исключение или нет.

public void testMethod() throws IOException {
    FileWriter fileWriter = new FileWriter("\\data.txt");
    try {
        fileWriter.write("Information...");
    } finally {
        fileWriter.close();
    }
}

Try - Catch - Finally

Здесь Finally блок используется чтобы подчистить результат выполнения кода.

public void testMethod() {
    FileWriter fileWriter = null;
    try {
        fileWriter = new FileWriter("\\data.txt");
        fileWriter.write("Information...");
    } catch (IOException ex) {
        ex.printStackTrace();
    } finally {
        try {
            fileWriter.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Try-with-resources Statement

try-with-resources statement используется для перечисления ресурсов, которые должны быть закрыты, когда они будут уже больше не нужны.
Ресурсы перечисляеются в блоке Try.

public void testMethod() throws IOException {
    try (FileWriter fw = new FileWriter("\\data.txt")) {
       fw.write("Information...");
    }
}

Ресурсы с AutoClosable interface могут использоваться внутри try-with-resources statement.

Multi-catch Clause

boolean isTest = false;
    public void testMethod() {
    try {
        if (isTest) {
            throw new IOException();
        } else {
            throw new SQLException();
        }
    } catch (IOException | SQLException e) {
        e.printStackTrace();
    }
}

Создание собственного класса исключений.

Класс собственного исключения должен содержать 2 конструктора:с рагументами и без.

public class ReportException extends Exception {
    public ReportException () {}
    public ReportException (String message, int reportId) {
        ...
    }
}

Обработка искоючений.

Объект исключения имеет 3 метода: getMessage(), toString() и printStackTrace().

getMessage() - возвращает детальное описание ошибки.

try {
    new FileReader("file.js");
} catch (FileNotFoundException fnfe) {
    System.err.println(fnfe.getMessage());
}

toString() - возвращает детальное описание ошибки включая название класса.

try {
    new FileReader("file.js");
} catch (FileNotFoundException fnfe) {
    System.err.println(fnfe.toString());
}

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

try {
    new FileReader("file.js");
} catch (FileNotFoundException fnfe) {
    fnfe.printStackTrace();
}

Java Modifiers
-------------------------------------------------------------------------------
Modifier            | Class | Interface | Constructor | Method | Data member
-------------------------------------------------------------------------------
Access modifiers
-------------------------------------------------------------------------------
package-private |   Yes |        Yes |             Yes |     Yes | Yes
private             |    No |          No |             Yes |     Yes | Yes
protected          |    No |          No |             Yes |     Yes | Yes
public               |   Yes |        Yes |             Yes |      Yes | Yes
-------------------------------------------------------------------------------
Other modifiers
-------------------------------------------------------------------------------
abstract            |  Yes |         Yes |             No |       Yes | No
final                 |  Yes |          No |              No |       Yes | Yes
native               |   No |          No |              No |       Yes | No
strictfp              |  Yes |        Yes |              No |       Yes | No
static                |    No |        No |               No |       Yes | Yes
synchronized      |    No |        No |               No |       Yes | No
transient           |    No |        No |               No |         No | Yes
volatile             |    No |        No |               No |         No | Yes
------------------------------------------------------------------------------
Внутренние классы могут также использовать private или protected access modifiers.
Локальные переменные могут использовать только 1 modifier: final.

packageprivate - ограничивает доступ к данным внутри пакета

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

protected - защищенный метод доступен изнутри пакета и снаружи пакета только черзе подклассы, содержащие этот метод.

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

abstract - абстрактный класс. Он не может быть записа со словоа final. Интерфейсы абстракты по умолчанию, для них этот модификатор записывать нет необходимости. Абстрактный метод содержит только свое название. Если хотя бы одни метод в классе абстрактный, то весь класс считается абстрактным.
Он не может быть записан со словами final, native, private, static, synchronized.


default - защитный метод по умолчанию позволяет создавать метод по умолчанию в интерфейсе.

final - финальный класс не может иметь потомков. Финальный метод не может быть перезаписан. Финальный data member (переменная) не может быть изменен. Со static final он задается во время компиляции и не может быть изменен.

native - нативный метод используется для смешивания кода C и C++ внутри Java кода. Он только содержит название, но не тело.
Он не может использоваться со strictfp.

static - статичные методы и статичные переменные иметют к себе доступ через имя класса. Нет необъодимости создавать объект для выозова этих методов.

strictfp - strictfp class позволяет использовать спецификацию IEEE 754-1985 floating-point
specification для всех операций с плавающей точкой.
strictfp метод имеет все выражения метода FP-strict.
Методы с интерфейсами не могут быть записаны strictfp. Он не может использоваться с native модификатором.

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

transient - transient данные не сериализуютс, когда класс сериализуется. Они не являются частью состояния объекта.

volatile - volatile данные информируют поток получить последнее значение переменной вместо закэшированного и записать все обновления в переменную как только они произойдут.

Импортирование библиотек.

По умолчанию во все пакеты импортируется библиотека java.lang.

package com.oreilly.tutorial;
import java.time.*;
// import java.time.ZoneId;
// import java.time.Clock;

public class HelloWorld {
    public static void main (String[] args) {
        ZoneId zi = ZoneId.systemDefault();
        Clock c = Clock.system(zi);
        System.out.print("From: " + c.getZone().getId());
        System.out.println(", \"Hello, World!\"");
    }
}

Компиляция Java-файлов

javac [-options] [source files] // Compiles Java source files.
javac HelloWorld.java

javac –version

javac –help

Java Program Packager

JAR file = Java Archive (JAR)

Java Documenter

javadoc [options] [packagenames] [sourcefiles] // This is the usage to produce Java documentation.

Standart Input - Output - Error

byte teamName[] = new byte[200];
int size = System.in.read(teamName);
System.out.write(teamName,0,size);
System.out.print("Team complete");
System.err.println("Not enough players");

Reading Character Data from a File

BufferedReader bReader = new BufferedReader(new FileReader("Master.txt"));
String lineContents;
while ((lineContents = bReader.readLine()) != null) {...}
bReader.close();

Reading Binary Data from a File

DataInputStream inStream = new DataInputStream(new FileInputStream("Team.bin"));
inStream.read();
DataInputStream inStream = new DataInputStream(new BufferedInputStream(new FileInputStream(team)));
unread(int i); // pushback a single byte
unread(byte[] b); // pushback array of bytes

Writing Character Data to a File

String in = "A huge line of text";
PrintWriter pWriter = new PrintWriter(new FileWriter("CoachList.txt"));
pWriter.println(in);
pWriter.close();

FileWriter fWriter = new FileWriter("CoachList.txt");
fwriter.write("This is the coach list.");
fwriter.close();

Writing Binary Data to a File

File positions = new File("Positions.bin");
Int[] pos = {0, 1, 2, 3, 4};
DataOutputStream outStream = new DataOutputStream(new FileOutputStream(positions));
for (int i = 0; i < pos.length; i++) {
    outStream.writeInt(pos[i]);
}
DataOutputStream outStream = new DataOutputStream(new BufferedOutputStream(positions));

Reading Character Data from a Socket

Socket socket = new Socket("127.0.0.1", 64783);
InputStreamReader reader = new InputStreamReader(socket.getInputStream());
BufferedReader bReader = new BufferedReader(reader);
String msg = bReader.readLine();

Reading Binary Data from a Socket

Socket socket = new Socket("127.0.0.1", 64783);
DataInputStream inStream = new DataInputStream(socket.getInputStream());
inStream.read();

DataInputStream inStream = new DataInputStream(new BufferedInputStream(socket.getInputStream()));

Writing Character Data to a Socket

Socket socket = new Socket("127.0.0.1", 64783);
PrintWriter pWriter = new PrintWriter(socket.getOutputStream());
pWriter.println("Dad, we won the game.");

Writing Binary Data to a Socket

byte positions[] = new byte[10];
Socket socket = new Socket("127.0.0.1", 64783);
DataOutputStream outStream = new DataOutputStream(socket.getOutputStream());
outStream.write(positions, 0, 10);
DataOutputStream outStream = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));

Serialize

ObjectOutputStream s = new ObjectOutputStream(new FileOutputStream("p.ser"));
ObjectOutputStream oStream = new
ObjectOutputStream(new FileOutputStream("PlayerDat.ser"));
oStream.writeObject(player);
oStream.close();

Deserialize

ObjectInputStream d = new ObjectInputStream(new FileInputStream("p.ser"));
ObjectInputStream iStream = new ObjectInputStream(new FileInputStream("PlayerDat.ser"));
Player p = (Player) iStream.readObject();

Zipping and Unzipping Files

ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream("out.zip"));
String[] fNames = new String[] {"f1", "f2"};
for (int i = 0; i < fNames.length; i++) {
    ZipEntry entry = new ZipEntry(fNames[i]);
    File InputStream fin = new FileInputStream(fNames[i]);
    try {
        zipOut.putNextEntry(entry);
        for (int a = fin.read(); a != -1; a = fin.read()) {
            zipOut.write(a);
        }
        fin.close();
        zipOut.close();
    } catch (IOException ioe) {...}
}

Creating Threads

Extending the Thread Class

class Comet extends Thread {
    public void run() {
        System.out.println("Orbiting");
        orbit();
    }
}
Comet halley = new Comet();
hally.run();

Implementing the Runnable Interface

class Asteroid implements Runnable {
    public void run() {
         System.out.println("Orbiting");
        orbit();
    }
}
Asteroid majaAsteroid = new Asteroid();
Thread majaThread = new Thread(majaAsteroid);
majaThread.run();

A single runnable instance can be passed to multiple thread objects.
Each thread performs the same task, as shown here after
the use of a Lambda Expression:

Runnable asteroid = () -> {
    System.out.println("Orbiting");
    orbit();
};

Thread asteroidThread1 = new Thread(asteroid);
Thread asteroidThread2 = new Thread(asteroid);
asteroidThread1.run();
asteroidThread2.run();

Thread States

NEW - поток создан, но не запущен.
RUNNABLE - поток доступный для запуска.
BLOCKED - живой поток, который заблокирован и ождает monitor lock
WAITING - живой поток, который вызывает свой метод wait() или join() пока ждет другой поток
TIMED_WAITING - живой поток, который ждет другой поток определенный период времени, во время которого он спит.
TERMINATED - завершенный поток.

Thread Priorities

Common Methods

getPriority()     - Returns the thread’s priority
getState()       - Returns the thread’s state
interrupt()       - Interrupts the thread
isAlive()          - Returns the thread’s alive status
isInterrupted() - Checks for interruption of the thread
join()              - Causes the thread that invokes this method to wait for the thread that this object represents to finish
setPriority(int) - Sets the thread’s priority
start()            - Places the thread into a runnable state
notify()          - Tells a thread to wake up and run
notifyAll()       - Tells all threads that are waiting on a thread or resource to wake up, and then the scheduler will select one of the threads to run
wait()             - Pauses a thread in a wait state until another thread calls notify() or notifyAll()
activeCount()   - Returns number of threads in the current thread’s group
currentThread() - Returns reference to the currently running thread
interrupted()     - Checks for interruption of the currently running thread
sleep(long)       - Blocks the currently running thread for parameter number of milliseconds
yield()              - Pauses the current thread to allow other threads to run

Common collections

Interface Ordered Dupes Notes
List              Yes Yes Positional access; element insertion control
Map         Can be No (Keys) Unique keys; one value mapping max per key
Queue          Yes Yes Holds elements; usually FIFO
Set          Can be No Uniqueness matters

Collection Framework Methods

Method     List params Set params Map params Returns
add                  index, element element n/a boolean
contains           Object Object n/a boolean
containsKey           n/a n/a key boolean
containsValue        n/a n/a value boolean
get                    index n/a key Object
indexOf            Object n/a n/a int
iterator               none none n/a Iterator
keySet                   n/a n/a none Set
put                        n/a n/a key, value void
remove  index or Object Object key void
size                     none none none int

Lambda functions
(parameter list) -> { statements; }

() -> 66
(x,y) -> x + y
(Integer x, Integer y) -> x*y
(String s) -> { System.out.println(s); }

Method and Constructor References

"some text"::length // Get length of String
String::length // Get length of String
CheckAcct::compareByBalance // Static method ref
myComparator::compareByName // Inst method part obj
super::toString // Super method part object
String::compareToIgnoreCase // Inst method arb obj
ArrayList<String>::new // New ArrayList constructor
Arrays::sort // Sort array elements

Fluent API

// StringBuilder API
StringBuilder sb = new StringBuilder("palindrome!");

// Method chaining
sb.delete(10, 11).append("s").reverse();
System.out.println("Value: " + sb);

$ Value: semordnilap

// Standalone static method
LocalDateTime ldt1 = LocalDateTime.now();
System.out.println(ldt1);

$ 2014-02-26T09:33:25.676

// Static method with method chaining
LocalDateTime ldt2 = LocalDateTime.now()
.withDayOfMonth(1).withYear(1878)
.plusWeeks(2).minus(3, ChronoUnit.HOURS);
System.out.println(ldt2);

$ 1878-02-15T06:33:25.724

Development, CM, and Test Tools

Apache Ant - основанный на XML инструмент для создания и установки Java приложений.

Apache Maven - инстрмент доя сборки, оформления отчетов и документации.

IBM WebSphere - Java EE сервер, использующийся для приложений, порталов и веб-сервисов.

Apache Tomcat - веб-контейнер для Java Servlets и JavaServer Pages.