AnyVal trong scala là gì, tại sao lại cần nó
Scala
50
White

LinhPT viết ngày 01/02/2016

Bạn nào làm java rồi chắc sẽ biết class có tên Object, thằng này chính là cha của tất cả các loại class khác.
Scala cũng có khái niệm gần tương tự như vậy, nhưng với cái tên khác gọi là Any. Thường thì các class kiểu này dùng trong những trường hợp bạn muốn generic hoá một xử lý, truyền một object kiểu chung chung, sau đó cast nó về một concrete object sau.

Tuy nhiên nhìn diagram dưới đây chúng ta sẽ thấy dưới Any còn có 2 thằng khác là AnyValAnyRef

alt text

Nhìn diagram trên sẽ dễ dàng nhận thấy

  • AnyVal chính là cha của những object dạng primitive, chỉ chứa giá trị đơn giản như là Double, Float, Long
  • AnyRef mà bản chất chính là java.lang.Object, là cha của ... tất cả những cái gì còn lại

Vậy AnyVal ngoài việc là cha của những kiểu primitive như trên thì còn có tác dụng gì nữa không nhỉ????
Nó còn có một tác dụng nữa gọi là Value Object mà mình sẽ giới thiệu kĩ hơn ơ dưới đây.

Theo như trên trang chủ của scala thì kĩ thuật này có tác dụng như sau

Value classes are a new mechanism in Scala to avoid allocating runtime objects. This is accomplished through the definition of new AnyVal subclasses. They were proposed in SIP-15. The following shows a very minimal value class definition:

Đó đó, tác dụng lớn nhất của việc sử dụng AnyVal sẽ là để avoid allocating runtime objects.

Why???

Có 2 lý do chính

  • Overhead của việc "tạo" và "xoá" (thông qua GC) object của java là không nhỏ
  • Tác dụng của việc "boxing" và "unboxing" các giá trị primitive như là số thực, số nguyên cũng không nhỏ

How????

Rất đơn giản, extend entity object của bạn với AnyVal

class Wrapper(val underlying: Int) extends AnyVal {
  def foo: Wrapper = new Wrapper(underlying * 19)
}

Compiler sẽ "tự động" biên dịch class Wrapper thành giá trị primitive Int thay vì init một object mới.

When???

Khi bạn muốn dùng kĩ thuật entity object, tức là muốn tạo ra những class chỉ chứa giá trị đơn giản , ví dụ như

case class UserId(value: Long) extends AnyVal
case class BoardId(value: Long) extends AnyVal
case class GroupId(value: Long) extends AnyVal
case class UserName(value: String) extends AnyVal
case class BoardName(value: String) extends AnyVal

cơ mà bạn sẽ hỏi

Sao không dùng quách Long hay String cho xong, cho nó vào class rồi lại phải extends AnyVal để cho compiler hiểu và biên dịch nó thành Long và String, ấu trĩ vãi..

Lý do là bạn cần một đoạn code "dễ hiểu".
Khi bạn pass type UserId hay BoardId vào những xử lý khác, ở những đoạn code khác, người đọc sẽ dễ hiểu hơn nhiều, so với việc bạn sử dụng trực tiếp các giá trị Long và String, vì Long và String chả nói lên ý nghĩ gì cả.

Kĩ thuật Value Object này cũng có một vài drawback, mà bạn có thể tham khảo thêm ở link này:
http://docs.scala-lang.org/overviews/core/value-classes.html

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

LinhPT

20 bài viết.
57 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
33 3
Mình thi thoảng phải quản lý linux server, mà trong đó có một số thao tác quản lý quan trong như quản lý đĩa cứng, quản lý mạng, quản lý đường truy...
LinhPT viết hơn 2 năm trước
33 3
White
23 2
(Ảnh) Tiêu đề chỉ là câu khách :v, thực ra là có một vài điểm về mysql explain mà chắc chưa nhiều bạn biết, tớ cũng hay quên nên note lại cho nhớ ...
LinhPT viết hơn 2 năm trước
23 2
White
18 0
Bài viết được dịch từ http://qiita.com/sion_cojp/items/04a2aa76a1021fe77079 Điều cần nhớ trước khi đánh bất kì câu lệnh nào ①Để tránh làm nặng...
LinhPT viết 9 tháng trước
18 0
Bài viết liên quan
White
10 0
Kí tự Regex cơ bản Về cơ bản thì các sử lý matching của scala.util.matching.Regex sẽ được "phó thác" (delegate) cho java Regex. Bạn có thể tạo một ...
huydx viết hơn 2 năm trước
10 0
White
7 1
Trong scala kí tự _ được dùng với khá nhiều mục đích .. không liên quan đến nhau. Tạm note lại cái đã khi nào có time sẽ quay lại viết cẩn thận sa...
huydx viết hơn 2 năm trước
7 1
White
0 0
(Bài viết hơi khó hiểu, dành cho bạn nào có hứng thú với type programming trong scala với các thư viện như shapeless chẳng hạn) Thông thường với m...
huydx viết gần 2 năm trước
0 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
20 bài viết.
57 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!