2017-08-16 18 views
6

Nếu tôi đang lập mô hình đối tượng giá trị của mình bằng cách sử dụng lớp dữ liệu Kotlin cách tốt nhất để xử lý xác thực là gì. Có vẻ như khối init là nơi duy nhất hợp lý kể từ khi nó thực hiện sau khi các nhà xây dựng chính.Tham số lớp dữ liệu hợp lệ Kotlin

data class EmailAddress(val address: String) { 

    init { 
     if (address.isEmpty() || !address.matches(Regex("^[a-zA-Z0-9][email protected][a-zA-Z0-9]+(.[a-zA-Z]{2,})$"))) { 
      throw IllegalArgumentException("${address} is not a valid email address") 
     } 
    } 
} 

Sử dụng JSR-303 Ví dụ

Nhược điểm này là nó đòi hỏi thời gian tải dệt

@Configurable 
data class EmailAddress(@Email val address: String) { 

    @Autowired 
    lateinit var validator: Validator 

    init { 
     validator.validate(this) 
    } 
} 
+0

Tôi luôn làm điều gì đó tương tự như ví dụ đầu tiên của bạn, nhưng tôi chỉ đặt phương thức 'validate' rõ ràng và gọi nó từ bộ điều khiển (ví dụ, trong trường hợp tôi có một đối tượng yêu cầu được điền bởi S pring boot như một '@ RequestBody' và tôi muốn xác thực các đầu vào. – Kevin

Trả lời

0

Trên thực tế, có vẻ như xác nhận đó không phải là trách nhiệm của các tầng lớp dữ liệu. data tự cho biết - nó được sử dụng để lưu trữ dữ liệu.

  1. Vì vậy, nếu bạn muốn kiểm tra lớp dữ liệu, nó sẽ làm cho cảm giác hoàn hảo để thiết @get: xác nhận vào lập luận của các nhà xây dựng và xác nhận bên ngoài của lớp dữ liệu trong lớp, chịu trách nhiệm xây dựng.

  2. tùy chọn thứ hai của bạn là không sử dụng lớp dữ liệu, chỉ cần sử dụng lớp đơn giản và thực hiện toàn bộ logic trong các nhà xây dựng đi qua validator có

  3. Ngoài ra, nếu bạn sử dụng Spring Framework - bạn có thể làm cho lớp này Bean với nguyên mẫu phạm vi, nhưng rất có thể là sẽ hoàn toàn không thoải mái khi làm việc với loại mã spaghetti đó :)

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