Tôi có một câu hỏi rất đơn giản - khi nào chúng ta nên áp dụng từ khóa mới khi tạo đối tượng trong Scala? Có phải khi chúng tôi cố gắng để khởi tạo các đối tượng Java không?Từ khóa "mới" trong Scala
Trả lời
Sử dụng các từ khóa new
khi bạn muốn đề cập đến một class
's constructor riêng:
class Foo { }
val f = new Foo
Bỏ qua new
nếu bạn đang đề cập đến phương pháp đối tượng bạn đồng hành của apply
:
class Foo { }
object Foo {
def apply() = new Foo
}
// Both of these are legal
val f = Foo()
val f2 = new Foo
Nếu bạn đã thực hiện một trường hợp lớp học:
case class Foo()
Scala bí mật tạo ra một đối tượng đồng hành cho bạn, biến nó thành này:
class Foo { }
object Foo {
def apply() = new Foo
}
Vì vậy, bạn có thể làm
f = Foo()
Cuối cùng, hãy nhớ rằng không có quy tắc mà nói rằng người bạn đồng hành apply
phương thức phải là proxy cho hàm tạo:
class Foo { }
object Foo {
def apply() = 7
}
// These do different things
> println(new Foo)
[email protected]
> println(Foo())
7
Và, vì bạn đã đề cập đến các lớp Java: có - Các lớp Java hiếm khi hav e đối tượng đồng hành với phương thức apply
, vì vậy bạn phải sử dụng new
và phương thức khởi tạo của lớp thực tế là .
Có phải khi chúng tôi cố gắng khởi tạo các đối tượng java không?
Không hề. Có hai trường hợp chung khi bạn ommit new
trong scala. Với đối tượng singleton (được oftenly sử dụng để lưu trữ các chức năng tĩnh và như một loại máy tương tự như những gì bạn có thể thấy trong java):
scala> object LonelyGuy { def mood = "sad" }
defined module LonelyGuy
scala> LonelyGuy
res0: LonelyGuy.type = [email protected]
scala> LonelyGuy.mood
res4: java.lang.String = sad
Với case classes (trên thực tế, bên dưới có lớp + object = companion mẫu, ví dụ: có lớp và đối tượng có cùng tên):
scala> case class Foo(bar: String)
defined class Foo
scala> Foo("baz")
res2: Foo = Foo(baz)
Vì vậy, khi bạn làm việc với một lớp học đơn giản, quy tắc cũng giống như với Java.
scala> class Foo(val bar: String)
defined class Foo
scala> new Foo("baz")
res0: Foo = [email protected]
// will be a error
scala> Foo("baz")
<console>:8: error: not found: value Foo
Foo("baz")
thưởng, có một lớp học vô danh trong scala, có thể được xây dựng như thế này:
scala> new { val bar = "baz" }
res2: java.lang.Object{val bar: java.lang.String} = [email protected]
scala> res2.bar
res3: java.lang.String = baz
- 1. Scala: các đối tượng đồng hành và từ khóa "mới"
- 2. Từ khóa forSome trong Scala là gì?
- 3. Sử dụng từ khóa mới trong C#
- 4. Scala với việc sử dụng từ khóa
- 5. điều tra các từ khóa `loại` và` # `trong scala
- 6. Scala này 'mới' cú pháp
- 7. Từ khóa "mới" trong khai báo thuộc tính trong C#
- 8. C++: struct và mới từ khóa
- 9. Vai trò của từ khóa mới trong Java
- 10. Tạo mảng mới từ danh sách khóa trong PHP
- 11. không thể hiểu từ khóa mới trong java
- 12. 'mới' từ khóa trong getter> hiệu suất hit?
- 13. Từ khóa "mới" làm gì với cấu trúc trong C#?
- 14. từ khóa mới mà không cần tên lớp trong C#
- 15. mới hành vi desugaring trong Scala 2.10.1
- 16. Porting mới Iterable {} mã từ Scala 2.7.7 đến 2.8
- 17. gọi phương thức cơ sở sử dụng từ khóa mới
- 18. java mới là gì? Một hàm hoặc từ khóa
- 19. Tại sao từ khóa mới không cần thiết cho Chuỗi
- 20. hỏi bộ nhớ Java về 'mới' từ khóa
- 21. Tạo từ khóa Perl mới với Devel :: Declare
- 22. Ô tuỳ chỉnh mới từ XIB gây ra tuân thủ mã hóa khóa cho khóa ...?
- 23. Scala tương đương với HashSet mới (Collection)
- 24. Tạo gói * mới * trong Trình biên dịch Scala Plugin
- 25. Loại scala động mới làm gì?
- 26. Sử dụng R từ Scala và gọi Scala từ R?
- 27. Từ khóa C# 4.0 'động' mới có phản đối từ khoá 'var' không?
- 28. Tại sao tôi cần từ khóa `mới` cho một phiên bản` Ngày` trong JavaScript?
- 29. Autowiring trong mùa xuân đậu (@Component) tạo ra với từ khóa mới
- 30. Xác định các từ khóa mới trong biểu thức tính toán của F #
hạng A Java không bao giờ có thể có một đối tượng đồng. Nó có thể có một đối tượng có thể hoạt động như một Nhà máy cho lớp Java - nhưng đối tượng này không phải là đối tượng đồng hành của nó. – sschaef
@Antoras Kể từ khi các lớp Scala biên dịch sang Java bytecode, và có thể được phân phối dưới dạng biên dịch, Scala có thể cho biết sự khác biệt giữa đồng hành Scala thực và lớp Foo $ với thành phần MODULE $ tĩnh không? – Owen
Tôi nghĩ rằng scalac có thể khác nhau bởi vì nó là spec'ed rằng một đối tượng đồng hành phải được khai báo trong cùng một tập tin như lớp đồng hành của nó.Bởi vì "thuộc tính" đồng hành chỉ tồn tại trong Scala và không phải trên cấp độ bằng giọng nói của Bytecode, phải kiểm tra mã Scala và không phải mã Bytecode để chắc chắn rằng thông số được theo sau. – sschaef