ปิดผนึกด้วยคลาส

คำศัพท์ Kotlin - คลาสปิดผนึก

บ่อยครั้งที่เราต้องแสดงความเป็นไปได้ที่ จำกัด คำขอทางเว็บจะประสบความสำเร็จหรือล้มเหลวUserสามารถเป็นได้เฉพาะผู้ใช้มืออาชีพหรือผู้ใช้มาตรฐาน

ในการสร้างแบบจำลองนี้เราสามารถใช้ an enumได้ แต่สิ่งนี้มีข้อ จำกัด หลายประการ คลาส Enum อนุญาตเพียงอินสแตนซ์เดียวของแต่ละค่าและไม่สามารถเข้ารหัสข้อมูลเพิ่มเติมเกี่ยวกับแต่ละประเภทเช่นErrorกรณีที่มีExceptionคุณสมบัติที่เกี่ยวข้อง

คุณสามารถใช้คลาสนามธรรมและส่วนขยายจำนวนมากได้ แต่สิ่งนี้จะสูญเสียชุดข้อได้เปรียบที่ จำกัด ซึ่งมาจาก enums คลาสที่ปิดผนึกมอบสิ่งที่ดีที่สุดให้กับทั้งสองโลก: เสรีภาพในการเป็นตัวแทนของคลาสนามธรรมและกลุ่มประเภทของ enums ที่ จำกัด อ่านต่อเพื่อเรียนรู้เพิ่มเติมเกี่ยวกับคลาสที่ปิดผนึกหรือหากคุณต้องการวิดีโอโปรดดูที่นี่:

พื้นฐานของคลาสปิดผนึก

เช่นเดียวกับคลาสนามธรรมคลาสปิดผนึกช่วยให้คุณสามารถแสดงลำดับชั้นได้ คลาสย่อยสามารถเป็นคลาสประเภทใดก็ได้: คลาสข้อมูลอ็อบเจ็กต์คลาสปกติหรือคลาสอื่นที่ปิดผนึก ซึ่งแตกต่างจากคลาสนามธรรมคุณต้องกำหนดลำดับชั้นเหล่านี้ในไฟล์เดียวกันหรือเป็นคลาสที่ซ้อนกัน

// Result.kt
sealed class Result<out T : Any> {
    data class Success<out T : Any>(val data: T) : Result<T>()
    data class Error(val exception: Exception) : Result<Nothing>()
}

Cannot access ‘<init>’: it is private in Result

บ่อยครั้งที่เราต้องการจัดการทุกประเภทที่เป็นไปได้:

when(result) {
    is Result.Success -> { }
    is Result.Error -> { }
}

sealed class Result<out T : Any> {
    data class Success<out T : Any>(val data: T) : Result<T>()
    data class Error(val exception: Exception) : Result<Nothing>()
    object InProgress : Result<Nothing>()
}

val action = when(result) {
    is Result.Success -> { }
    is Result.Error -> { }
}

เพื่อให้ได้รับประโยชน์ที่ดีนี้แม้ว่าเราจะใช้เมื่อเป็นคำสั่งก็ตามให้เพิ่มคุณสมบัติส่วนขยายตัวช่วยนี้:

val <T> T.exhaustive: T
    get() = this

when(result){
    is Result.Success -> { }
    is Result.Error -> { }
}.exhaustive

เนื่องจากทราบประเภทย่อยทั้งหมดของคลาสที่ปิดผนึก IDE สามารถเติมเต็มสาขาที่เป็นไปได้ทั้งหมดของคำสั่งเมื่อให้เรา:

คุณลักษณะนี้โดดเด่นด้วยลำดับชั้นของคลาสที่ปิดผนึกที่ซับซ้อนมากขึ้นเนื่องจาก IDE สามารถจดจำสาขาทั้งหมดได้:

sealed class Result<out T : Any> {
  data class Success<out T : Any>(val data: T) : Result<T>()
  sealed class Error(val exception: Exception) : Result<Nothing>() {
     class RecoverableError(exception: Exception) : Error(exception)
     class NonRecoverableError(exception: Exception) : 
                                               Error(exception)
  }
  object InProgress : Result<Nothing>()
}

      

ใต้ฝากระโปรง

แล้วอะไรที่ทำให้ชั้นเรียนที่ปิดผนึกมีพฤติกรรมเหมือนพวกเขา มาดูกันว่าเกิดอะไรขึ้นในโค้ด Java ที่ถอดรหัส:

sealed class Result
data class Success(val data: Any) : Result()
data class Error(val exception: Exception) : Result()
@Metadata(
…
d2 = {“Lio/testapp/Result;”, “T”, “”, “()V”, “Error”, “Success”, “Lio/testapp/Result$Success;”, “Lio/testapp/Result$Error;” …}
)
public abstract class Result {
    private Result() {}
    // $FF: synthetic method
    public Result(DefaultConstructorMarker $constructor_marker) {
        this();
    }
}

Resultจะดำเนินการเป็นระดับนามธรรมที่มีสองก่อสร้าง:

  • ตัวสร้างเริ่มต้นส่วนตัว
  • ตัวสร้างสังเคราะห์ที่คอมไพเลอร์ Kotlin ใช้ได้เท่านั้น

public final class Success extends Result {
    @NotNull
    private final Object data
    
    public Success(@NotNull Object data) {
      
       super((DefaultConstructorMarker)null);
       this.data = data;
    }

Suggested posts

โยกย้ายจาก Dagger2 ไปยัง Hilt ในโครงการหลายโมดูล

โยกย้ายจาก Dagger2 ไปยัง Hilt ในโครงการหลายโมดูล

คำแนะนำทีละขั้นตอนในการโยกย้ายจาก Dagger ไปยัง Hilt ในโครงการหลายโมดูล โครงสร้างโครงการ เพื่อให้เห็นภาพโครงการ ประกอบด้วยโมดูลหลายโมดูล NetworkModule, StorageModule, CommonModule, FeatureModule เป็นต้น

แอนดรอยด์ | Gboard ได้รับการรีเฟรชด้วยเลย์เอาต์ใหม่สำหรับแท็บเล็ต

Google ได้รีเฟรชเค้าโครงแป้นพิมพ์ทันเวลาสำหรับการเปิดตัว Pixel Fold และ Pixel Tab

แอนดรอยด์ | Gboard ได้รับการรีเฟรชด้วยเลย์เอาต์ใหม่สำหรับแท็บเล็ต

Google เพิ่งอัปเดตแอปแป้นพิมพ์ Gboard สำหรับ Android เพื่อรวมเค้าโครงใหม่ที่ปรับให้เหมาะกับแท็บเล็ต เมื่อเช้านี้ฉันสังเกตเห็นว่าฉันมีปัญหาในการพิมพ์ และเมื่อตรวจสอบเพิ่มเติม ฉันพบว่าแป้นพิมพ์ถูกเปลี่ยน

Related posts

การรวบรวม OSINT เพื่อการล่าภัยคุกคาม

การรวบรวม OSINT เพื่อการล่าภัยคุกคาม

สวัสดีชาวไซเบอร์! ยินดีต้อนรับกลับสู่ OSINT สำหรับซีรี่ส์การล่าภัยคุกคาม ในบทความแรก ฉันได้ให้ภาพรวมของ OSINT และความสำคัญในการตามล่าภัยคุกคาม

การค้นหาข้อมูลเกี่ยวกับชื่อโดเมน

ตัดตอนมาจาก Small, Sharp Software Tools โดย Brian P. Hogan

การค้นหาข้อมูลเกี่ยวกับชื่อโดเมน

เมื่อคุณส่งคำขอไปที่ facebook.com คอมพิวเตอร์ของคุณจะค้นหาชื่อโดเมนเพื่อแปลชื่อโดเมนนั้นเป็นที่อยู่ IP เพื่อให้คอมพิวเตอร์ของคุณสามารถเชื่อมต่อได้

คลังข้อมูลภัยคุกคามนั้น: เล่มที่ 7 Black Basta

คลังข้อมูลภัยคุกคามนั้น: เล่มที่ 7 Black Basta

ในโลกที่เชื่อมต่อถึงกันทุกวันนี้ ภัยคุกคามจากการโจมตีทางไซเบอร์นั้นแพร่หลายมากขึ้นกว่าเดิม อาชญากรไซเบอร์และผู้มีบทบาทในระดับชาติพยายามใช้ประโยชน์จากช่องโหว่และขโมยข้อมูลที่มีค่าอย่างต่อเนื่อง ซึ่งก่อให้เกิดความเสี่ยงที่สำคัญต่อองค์กรทุกขนาด

ติดตามใครก็ได้ด้วยหมายเลขโทรศัพท์ | การสอบสวน OSINT

ติดตามใครก็ได้ด้วยหมายเลขโทรศัพท์ | การสอบสวน OSINT

คุณสามารถเป็น OSINT Investigator, CTF Player หรือเพียงแค่ใครก็ตามที่ได้รับสายสแปม ผู้ที่พยายามยืนยันหมายเลขที่คุณเห็นในโฆษณา