2016-03-13 39 views
20

Tôi phát triển các ứng dụng Android và thường sử dụng chú thích làm kiểm tra tham số thời gian biên dịch, chủ yếu là android support annotations.Làm cách nào để sử dụng chú thích Hỗ trợ Android typedef trong kotlin?

Ví dụ trong mã java:

public class Test 
{ 
    @IntDef({Speed.SLOW,Speed.NORMAL,Speed.FAST}) 
    public @interface Speed 
    { 
     public static final int SLOW = 0; 
     public static final int NORMAL = 1; 
     public static final int FAST = 2; 
    } 

    @Speed 
    private int speed; 

    public void setSpeed(@Speed int speed) 
    { 
     this.speed = speed; 
    } 
} 

Tôi không muốn sử dụng enums vì các vấn đề hiệu suất của họ trong Android. Bộ chuyển đổi tự động thành kotlin chỉ tạo mã không hợp lệ. Làm cách nào để sử dụng chú thích @IntDef trong kotlin?

+1

Bạn có thể sử dụng enums tự do, họ không 'chậm' trong bất kỳ ý nghĩa (http://stackoverflow.com/questions/5143256/why-was-avoid-enums-where -you-only-need-ints-remove-from-androids-performanc) –

+0

@AlexanderUdalov, 1) https://www.youtube.com/watch?v=Hzs6OBcvNQE 2) enums không thể chuyển nhượng theo mặc định cũng cho biết thêm bản mẫu mã khi nó cần để chuyển đến tham số ý định 3) khi giá trị nhận được từ mạng cách chuyển đổi nó thành enum là tối nghĩa và loại bỏ an toàn enum. – curioushikhov

+1

@curioushikhov ProGuard "đơn giản hóa các loại enum thành hằng số nguyên, bất cứ khi nào có thể" ([Tối ưu hóa] (http://proguard.sourceforge.net/manual/optimizations.html)). – mfulton26

Trả lời

24

Có thể sử dụng chú thích hỗ trợ @IntDef bằng cách xác định giá trị của bạn bên ngoài của lớp chú thích là const val s.

Sử dụng ví dụ của bạn:

import android.support.annotation.IntDef 

public class Test { 

    companion object { 

     @IntDef(SLOW, NORMAL, FAST) 
     @Retention(AnnotationRetention.SOURCE) 
     annotation class Speed 

     const val SLOW = 0L 
     const val NORMAL = 1L 
     const val FAST = 2L 
    } 

    @Speed 
    private lateinit var speed: Long 

    public fun setSpeed(@Speed speed: Long) { 
     this.speed = speed 
    } 
} 

Lưu ý rằng vào thời điểm này trình biên dịch dường như đòi hỏi loại Long cho @IntDef chú thích thay vì thực tế Int s.

+9

Tôi đã làm điều này, nhưng Kotlin dường như không thực thi ràng buộc này chút nào. Tôi có thể cung cấp bất kỳ int/long, nơi '@ Speed' là cần thiết, và nó không quan tâm. – AutonomousApps

+1

Btw, nó đòi hỏi một 'Long' vì' @ IntDef' được định nghĩa là lấy một mảng 'long' -' long [] value() default {}; ' – AutonomousApps

8

Hiện tại không có cách nào để đạt được chính xác điều này trong Kotlin, vì lớp chú thích không thể có phần thân và do đó bạn không thể khai báo hằng số trong đó sẽ được xử lý bởi IntDef. Tôi đã tạo sự cố trong trình theo dõi: https://youtrack.jetbrains.com/issue/KT-11392

Vì vấn đề của bạn, tôi khuyên bạn nên sử dụng enum đơn giản.

2

Sử dụng này:

companion object { 
    const val FLAG_PAGE_PROCESS = 0L//待处理 
    const val FLAG_PAGE_EXCEPTION = 1L//设备异常 
    const val FLAG_PAGE_UNCHECKED = 2L//未审核 
    const val FLAG_PAGE_AUDIT = 3L//统计 
    val FLAG_PAGE = "FLAG_PAGE" 

    fun newInstance(@FlagPageDef flagPage: Int): RepairFormsListFragment { 
     val fragment = RepairFormsListFragment() 
     val args = Bundle() 
     fragment.arguments = args 
     return fragment 
    } 

    @Retention(AnnotationRetention.SOURCE) 
    @IntDef(FLAG_PAGE_PROCESS, FLAG_PAGE_EXCEPTION, FLAG_PAGE_UNCHECKED, FLAG_PAGE_AUDIT) 
    annotation class FlagPageDef 
} 
Các vấn đề liên quan