kotlin中内部类和单例类用object修饰,java代码如下:
class Demo {
private static class SingletonHolder {
private static Demo instance = new Demo();
}
}
转化为kotlin代码如下:
internal class Demo {
private object SingletonHolder {
private val instance = Demo()
}
}
处理单例时,object会使得整个类都是单例的,类中的所有可访问方法都可以通过类似静态方法调用那样通过类名+方法名访问,如果只是想让部分方法按照静态方法样式访问,可以使用companion object,java代码如下:
public class MainActivity2 extends AppCompatActivity {
private static final String TAG = "MainActivity2";
private static final int NUM = 99;
private static int NUM2 = 99;
private int NUM3 = 99;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
}
public static void printData(){
Log.d(TAG, "printData: ");
}
public void printData2(){
Log.d(TAG, "printData2: ");
}
public static String getData(){
return System.currentTimeMillis()+"";
}
}
转化为kotlin代码如下:
class MainActivity2 : AppCompatActivity() {
private val NUM3 = 99
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main2)
}
fun printData2() {
Log.d(TAG, "printData2: ")
}
companion object {
private const val TAG = "MainActivity2"
private const val NUM = 99
private const val NUM2 = 99
fun printData() {
Log.d(TAG, "printData: ")
}
val data: String
get() = System.currentTimeMillis().toString() + ""
}
}
可以看到static修饰的java方法和变量都被放到了companion object代码块中了。
由于kotlin中已经有了常量修饰符val,companion object代码块以及顶层类变量推荐加上const关键字,android studio也会提示开发者添加const关键字
上面的companion object以及objec虽然可以以静态方法的形式访问方法,但实际是通过静态内部类实现的,方法并非静态方法,实现静态方法需要在companion object或者objec类中添加@JvmStatic注解。
class Single {
companion object{
@JvmStatic
fun getData(){
}
fun getName():String{
return ""
}
}
}