2017-10-20 31 views
6

Trong Java nó có thể che giấu một lớp constructor chính bằng cách làm cho nó private và sau đó truy cập vào nó thông qua một phương pháp publicstatic bên trong lớp rằng:Private constructor trong Kotlin

public final class Foo { 
    /* Public static method */ 
    public static final Foo constructorA() { 
     // do stuff 

     return new Foo(someData); 
    } 

    private final Data someData; 

    /* Main constructor */ 
    private Foo(final Data someData) { 
     Objects.requireNonNull(someData); 

     this.someData = someData; 
    } 

    // ... 
} 

Làm thế nào có thể cùng đạt được với Kotlin mà không tách lớp thành giao diện public và triển khai private? Tạo một hàm tạo private dẫn đến không thể truy cập từ bên ngoài lớp, thậm chí không từ cùng một tệp.

Trả lời

5

Điều này có thể sử dụng một đối tượng đồng:

class Foo private constructor(val someData: Data) { 
    companion object { 
     fun constructorA(): Foo { 
      // do stuff 

      return Foo(someData) 
     } 
    } 

    // ... 
} 

Phương pháp bên trong đối tượng đồng có thể đạt được giống như thể chúng là thành viên của lớp xung quanh (ví dụ Foo.constructorA())

4

Bạn thậm chí có thể làm điều gì đó tương tự như "mô phỏng" cách sử dụng hàm dựng công khai trong khi có hàm tạo riêng.

class Foo private constructor(val someData: Data) { 
    companion object { 
     operator fun invoke(): Foo { 
      // do stuff 

      return Foo(someData) 
     } 
    } 
} 

//usage 
Foo() //even though it looks like constructor, it is a function call