在Kotlin中创建一个属性,如果是val
,那么会自动生成getter
方法,如果是var
,那么会自动生成getter
和setter
方法。
1 | class MethodFoo() { |
生成的class内容1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20public final class MethodFoo {
private int a = 1;
private int b = 2;
public final int getA() {
return this.a;
}
public final void setA(int var1) {
this.a = var1;
}
public final int getB() {
return this.b;
}
public final void setB(int var1) {
this.b = var1;
}
}
自动生成get
和set
在开发的时候,经常会用到一些常量,而常量一般放在一个公共的类里面,在Kotlin中,我们是这样写的:1
2
3
4
5
6
7
8
9
10
11
12object Constant {
val ACTION_FINDVIEWBYID = "FindViewById"
val ACTION_BUTTERKNIFE = "ButterKnife"
val SELECTED_TEXT_SUFFIX = ".xml"
val PSI_METHOD_BY_ONCREATE = "onCreate"
val PSI_METHOD_BY_ONCREATEVIEW = "onCreateView"
val CREATOR_COMMAND_NAME = "Generate Injections"
val CLASS_TYPE_BY_ACTIVITY = "activity"
val CLASS_TYPE_BY_FRAGMENT = "fragment"
val FIELD_ON_CLICK = "OnClick"
val FIELD_ONCLICK = "onClick"
}
生成的代码是这样的:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
public final class Constant {
private static final String ACTION_FINDVIEWBYID = "FindViewById";
private static final String ACTION_BUTTERKNIFE = "ButterKnife";
private static final String SELECTED_TEXT_SUFFIX = ".xml";
private static final String PSI_METHOD_BY_ONCREATE = "onCreate";
private static final String PSI_METHOD_BY_ONCREATEVIEW = "onCreateView";
private static final String CREATOR_COMMAND_NAME = "Generate Injections";
private static final String CLASS_TYPE_BY_ACTIVITY = "activity";
private static final String CLASS_TYPE_BY_FRAGMENT = "fragment";
private static final String FIELD_ON_CLICK = "OnClick";
private static final String FIELD_ONCLICK = "onClick";
public static final Constant INSTANCE;
public final String getACTION_FINDVIEWBYID() {
return ACTION_FINDVIEWBYID;
}
public final String getACTION_BUTTERKNIFE() {
return ACTION_BUTTERKNIFE;
}
public final String getSELECTED_TEXT_SUFFIX() {
return SELECTED_TEXT_SUFFIX;
}
public final String getPSI_METHOD_BY_ONCREATE() {
return PSI_METHOD_BY_ONCREATE;
}
public final String getPSI_METHOD_BY_ONCREATEVIEW() {
return PSI_METHOD_BY_ONCREATEVIEW;
}
public final String getCREATOR_COMMAND_NAME() {
return CREATOR_COMMAND_NAME;
}
public final String getCLASS_TYPE_BY_ACTIVITY() {
return CLASS_TYPE_BY_ACTIVITY;
}
public final String getCLASS_TYPE_BY_FRAGMENT() {
return CLASS_TYPE_BY_FRAGMENT;
}
public final String getFIELD_ON_CLICK() {
return FIELD_ON_CLICK;
}
public final String getFIELD_ONCLICK() {
return FIELD_ONCLICK;
}
private Constant() {
INSTANCE = (Constant)this;
ACTION_FINDVIEWBYID = "FindViewById";
ACTION_BUTTERKNIFE = "ButterKnife";
SELECTED_TEXT_SUFFIX = ".xml";
PSI_METHOD_BY_ONCREATE = "onCreate";
PSI_METHOD_BY_ONCREATEVIEW = "onCreateView";
CREATOR_COMMAND_NAME = "Generate Injections";
CLASS_TYPE_BY_ACTIVITY = "activity";
CLASS_TYPE_BY_FRAGMENT = "fragment";
FIELD_ON_CLICK = "OnClick";
FIELD_ONCLICK = "onClick";
}
static {
new Constant();
}
}
这….生成了那么多的get
方法,如果我有100个字段,那么就多生成了100个get
方法,我只是想要Constant.fieldName
这样子调用这个字段而已,根本不需要用到get
,这样明显是创建了多余的方法,方法数增多容易报65535
错。
如何避免生成
在Kotlin中,可以使用两种方法来停止自动生成get
和set
方法。
使用const
关键字
1 | object Constant { |
来看一下编译后的内容1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31public final class Constant {
public static final String ACTION_FINDVIEWBYID = "FindViewById";
public static final String ACTION_BUTTERKNIFE = "ButterKnife";
public static final String SELECTED_TEXT_SUFFIX = ".xml";
public static final String PSI_METHOD_BY_ONCREATE = "onCreate";
public static final String PSI_METHOD_BY_ONCREATEVIEW = "onCreateView";
public static final String CREATOR_COMMAND_NAME = "Generate Injections";
public static final String CLASS_TYPE_BY_ACTIVITY = "activity";
public static final String CLASS_TYPE_BY_FRAGMENT = "fragment";
public static final String FIELD_ON_CLICK = "OnClick";
public static final String FIELD_ONCLICK = "onClick";
public static final Constant INSTANCE;
private Constant() {
INSTANCE = (Constant)this;
}
static {
new Constant();
}
}
使用@JvmField
注解
1 | object Constant { |
来看一下编译后的内容
1 | public final class Constant { |
后记
当我们使用Kotlin定义大量的公共字段的时候,一定要这样写来避免方法数过多。