2016-03-13 12 views
20

私はAndroidアプリケーションを開発し、多くの場合アンドロイドのsupport annotationsというコンパイル時のパラメータチェックとして注釈を使用します。 JavaコードでkotlinでAndroidサポートのtypedefアノテーションを使用するには?

例:

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; 
    } 
} 

ため、私はアンドロイドでのパフォーマンスの問題の列挙型を使用する必要はありません。 kotlinへの自動変換器は無効なコードを生成するだけです。 kotlinで@IntDefアノテーションを使用するにはどうすればよいですか?

+1

あなたが自由に列挙型を使用することができ、彼らは(どんな意味で「遅い」ではありませんhttp://stackoverflow.com/questions/5143256/why-was-avoid-enums-where android-performanc) –

+0

@AlexanderUdalov、1)https://www.youtube.com/watch?v=Hzs6OBcvNQE 2)列挙型はデフォルトでパーセル可能ではなく、定型文も追加されていますインテントのparamsに渡す必要があるときにコードを生成する3)ネットワークから受け取った値を列挙型に変換する方法が不明瞭で、列挙型の安全性を排除する。 – curioushikhov

+1

@curioushikhov ProGuardは、可能であれば、列挙型を整数定数に単純化します([Optimizations](http://proguard.sourceforge.net/manual/optimizations.html))。 – mfulton26

答えて

24

実際には、アノテーションクラスのの外側にの値をconst valとして定義することによって、@IntDefサポートアノテーションを使用することができます。この時点では、コンパイラではなく、実際のInt秒の@IntDef注釈にLongタイプを必要とするように思われること

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

注:

あなたの例を使用します。

+9

私はこれをしましたが、Kotlinはこの制約を全く実施していないようです。 '@ Speed'が必要なint/longを提供することができ、気にしません。 – AutonomousApps

+1

Btwでは、 '@ IntDef'は' long'の配列を取ると定義されているので 'Long'が必要です - ' long [] value()default {}; ' – AutonomousApps

8

現在のところ、注釈クラスには本文がありません。したがって、IntDefで処理される定数を宣言することができないため、これを正確にKotlinで達成する方法はありません。私はトラッカーに問題を作成しました:https://youtrack.jetbrains.com/issue/KT-11392

しかし、私は単純な列挙型を使用することをお勧めします。

2

使用この:

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 
} 
関連する問題