DongShi / TQMS

Thoughts and issues
0 stars 0 forks source link

Java, oh Java! #18

Open DongShi opened 7 years ago

DongShi commented 7 years ago

1, dynamic parameters is fun, say we have


public static main(String[] args)

it is actually identical to


public static main(String... args)
DongShi commented 7 years ago
  1. final is used like 'const' in C++ it can be used to decorate a variable, a method or a class.
public final class A {
     private static final int n = 100
     public final int get() {return n}
     public void set(u) {n = u} 
}
DongShi commented 7 years ago
  1. to-learn-list
    • [x] lambda expression
    • [ ] java synchronazation
    • [ ] java reflection
    • [ ] java performance
    • [ ] jackson
    • [ ] spring framework
    • [ ] apache camel
    • [x] maven
    • [x] java annotation
    • [ ] hibernate
    • [ ] h2db
    • [x] java collection
DongShi commented 7 years ago

about java annotation. Java annotations are typically used for the following purposes:

@interface MyAnnotation {
    String   value() default "";
    String   name();
    int      age();
    String[] newNames();
}

Compiler instructions

Build-time instructions Runtime instructions

you can specify for your custom annotation if it should be available at runtime, for inspection via reflection. You do so by annotating your annotation definition with the @Retention annotation. Here is how that is done:

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
import java.lang.annotation.Documented;
import java.lang.annotation.Inherited

@Inherited
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
@interface MyAnnotation {

    String   value() default "";

}

You can place Java annotations above classes, interfaces, methods, method parameters, fields and local variables.

DongShi commented 7 years ago

JRE vs JDK The JRE does not contain a Java compiler. Only the SDK does.

DongShi commented 7 years ago

Hibernate常用Annotation标签说明 @ javax.persistence.Entity

实体类定义,该标签表示当前类是一个Hibernate的数据库实体,对应着数据库中的某个表

位置:用于类级别

参数:无

样例:@Entity

注意:导入标签类时可能会有多个,这里使用的是javax.persistence.Entity

@javax.persistence.Table

实体类定义,该标签表示当前类是一个Hibernate的数据库实体,对应着数据库中的某个表

位置:用于类级别

参数:name – 用于指定表名,如果不指定则表名与类名相同,考虑到不同数据库的解析方式可能不一样,建议手工指定表名。表名统一用大写字母,单词之间用下划线分隔。

样例:@Table(name=”DAT_USER_INFO”)

注意:导入标签类时可能会有多个,这里使用的是javax.persistence.Table

@ javax.persistence.Id

该标签用于标识数据实体的主键

位置:用于主键属性的Get方法,QFrame约定为getId()方法

参数:无

样例:@Id

@ javax.persistence.GeneratedValue

定义主键生成方式,通常和@ org.hibernate.annotations.GenericGenerator一同使用,用于生成主键。

位置:用于主键属性的Get方法,QFrame约定为getId()方法。

参数:strategy -构造方式;generator -构造器名称。

样例:

1、 由Hibernate自动生成主键:@GeneratedValue(strategy=GenerationType.AUTO)

2、 根据主指构造器生成主键:@GeneratedValue(generator="assigned")

@ org.hibernate.annotations.GenericGenerator

Hibernate提供的主键构造器。通常与@GeneratedValue配合使用。

位置:用于主键属性的Get 方法。

参数:name -构造器名称,在@GeneratedValue 中引用;strategy -构造方式。

样例:

  1. 手工指定的主键: @GeneratedValue(generator="assigned") @GenericGenerator(name = "assigned", strategy = "assigned")

  2. 从Sequence 获取主键: @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="TASK_SEQ") @SequenceGenerator(name="TASK_SEQ",sequenceName="SEQ_GROUP_SEND_TASK")

@ javax.persistence.Column

用于表示实体属性对应数据库表的哪个字段。

位置:用于属性的Get 方法

参数:

name – 字段名,默认为属性名,建议手工指定,字段名统一使用大写字母

nullable -boolean 值,表示该属性是否可以为空,默认为true。

insertable -boolean 值,表示该属性是否在insert语句中包含,默认为true。

updatable -boolean 值,表示该属性是否在update 语句中包含,默认为true。

length -int值,表示该属性值的长度,通常用于字符串属性,默认为255。

unique -boolean 值,表示该属性值是否建立唯一索引,默认为false。

@ javax.persistence.Transient

用于标识不在数据库表中映射的属性。

位置:用于属性的Get 方法

参数:无

@ org.hibernate.annotations.Type

自定义类型,将属性用于自定义类型。通常用于定义枚举类型。

位置:用于属性的Get 方法

参数:type -类型完成名称(包含包名)

样例:@Type(type="net.osjava.xsmfms.entity.SendTypeDataType")

DongShi commented 7 years ago

image

DongShi commented 7 years ago

image

DongShi commented 7 years ago

Lambda语法详解

  1. 参数类型省略–绝大多数情况,编译器都可以从上下文环境中推断出lambda表达式的参数类型
  2. 当lambda表达式的参数个数只有一个,可以省略小括号
  3. 当lambda表达式只包含一条语句时,可以省略大括号、return和语句结尾的分号
  4. 使用Method Reference

lambda眼中的this 在lambda中,this不是指向lambda表达式产生的那个SAM对象,而是声明它的外部对象。

方法引用 前面介绍lambda表达式简化的时候,已经看过方法引用的身影了。方法引用可以在某些条件成立的情况下,更加简化lambda表达式的声明。方法引用语法格式有以下三种:

objectName::instanceMethod ClassName::staticMethod ClassName::instanceMethod 前两种方式类似,等同于把lambda表达式的参数直接当成instanceMethod|staticMethod的参数来调用。比如System.out::println等同于x->System.out.println(x);Math::max等同于(x, y)->Math.max(x,y)。

最后一种方式,等同于把lambda表达式的第一个参数当成instanceMethod的目标对象,其他剩余参数当成该方法的参数。比如String::toLowerCase等同于x->x.toLowerCase()。