2016-06-15 23 views
10

tôi có mẫu mã này:Kotlin Chú IntDef

class MeasureTextView: TextView { 
    constructor(context: Context?) : super(context) 
    constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) 
    constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) 
    constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int) : super(context, attrs, defStyleAttr, defStyleRes) 

    companion object{ 
     val UNIT_NONE = -1 
     val UNIT_KG = 1 
     val UNIT_LB = 0    
    } 

    fun setMeasureText(number: Float, unitType: Int){ 

     val suffix = when(unitType){ 
      UNIT_NONE -> { 
       EMPTY_STRING 
      } 
      UNIT_KG -> { 
       KG_SUFIX 
      } 
      UNIT_LB -> { 
       LB_SUFIX 
      } 
      else -> throw IllegalArgumentException("Wrong unitType passed to formatter: MeasureTextView.setMeasureText") 
     } 

     // set the final text 
     text = "$number $suffix" 
    } 
} 

Tôi muốn để có thể sử dụng, tại thời gian biên dịch, tính năng tự động hoàn thành kết hợp với IntDef chú thích, vì vậy khi tôi gọi setMeasureText(...), các tĩnh biến được hiển thị dưới dạng tùy chọn đối số của phương thức này.

Tôi đã tìm kiếm về điều này và tôi không thể tìm thấy nếu Kotlin hỗ trợ chú thích kiểu java này (ví dụ: intdef). Vì vậy, tôi đã thử nó, và thực hiện một chú thích cho điều này, nhưng nó sẽ không hiển thị trong tự động hoàn thành.

Câu hỏi của tôi: - Là Java chú thích IntDef hỗ trợ trong Kotlin (phiên bản mới nhất)

  • Nếu có, làm thế nào tôi có thể biến ở ON trong Android Studio IDE (nếu nó hoạt động, tôi có thể' t có được trình biên dịch để đề xuất nó).

  • Nếu nó không phải là, là có bất kỳ Kotlin chiều này làm cho biên dịch kiểm tra thời gian

+2

[Tại sao bạn không sử dụng 'enum'] (http://stackoverflow.com/questions/5143256/why-was-avoid-enums-where-you -only-need-ints-removed-from-androids-performanc)? – miensol

+0

không có lý do nào chỉ là một thảm hại. Enums đã được khuyến khích một vài năm trước bởi google vì lý do hiệu suất. Tôi được sử dụng để thích các hằng số tĩnh với chú thích intdef. Nhưng khi tôi đổi sang Kotlin, tính năng đó đã biến mất –

+1

Bản sao có thể có của [Cách sử dụng chú thích hỗ trợ Android typedef trong kotlin?] (Http://stackoverflow.com/questions/35976002/how-to-use-android-support-typedef -anotations-in-kotlin) –

Trả lời

17

Tính đến Kotlin 1.0.3, các @IntDef chú thích không được hỗ trợ, nhưng hỗ trợ được quy hoạch cho các phiên bản sau .

Cách Kotlin thực hiện các kiểm tra thời gian biên dịch này là sử dụng enum class thay vì một loạt các hằng số Int.

2

Nếu bạn đang gọi setMeasureText từ Java bạn có thể lấy nó để làm việc bằng cách tạo IntDef của bạn trong Java quá

// UnitType.java 
@Retention(RetentionPolicy.SOURCE) 
@IntDef({MeasureText.UNIT_KG, MeasureText.UNIT_LB, MeasureText.UNIT_NONE}) 
public @interface UnitType {} 

h/t Tonic Artos

Bạn cũng sẽ cần phải cập nhật đối tượng bạn đồng hành của bạn để làm các giá trị của bạn dài và có thể truy cập công khai

companion object{ 
    const val UNIT_NONE = -1L 
    const val UNIT_KG = 1L 
    const val UNIT_LB = 0L 
} 
+0

nah: pi am not. aha. nhưng cảm ơn cho tip anyway. có thể giúp ppl khác –

13

Điều lạ, nhưng câu hỏi này được tìm kiếm trước cùng với right answer

Sao chép nó ở đây:

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 
    } 
} 
+8

điều này không giải quyết được gì. Bạn có thể tạo chú thích giống như Java, nhưng bạn không thể hưởng lợi từ việc sử dụng IntDef trên Kotlin vì trình biên dịch không biết cách diễn giải nó. Lợi thế của IntDef là, nó sẽ hiển thị trong tự động hoàn thành và do đó, bạn có thể, hầu hết thời gian, sử dụng địa chỉ liên lạc IntDef thay vì enum. Lấy đi phần biên dịch, và chú thích chính nó là vô ích. –

+1

@ user3806331 không đồng ý. Tự động điền không phải là điểm duy nhất.Đó là hữu ích, bởi vì tham số chú thích được kiểm tra tại thời gian biên dịch, vì vậy bạn không thể gọi hàm này với '-1L' do nhầm lẫn –

+6

Tôi không nghĩ điều này là đúng. Tôi đã thử nghiệm bằng cách sử dụng @StringDef như một phần của tham số hàm tạo của lớp Kotlin của tôi và cảnh báo/lỗi biên dịch thời gian không bao giờ bị ném khi tôi chuyển một loại không hợp lệ cho nó. – w3bshark

Các vấn đề liên quan