Contenu connexe Similaire à ddd+scala (20) ddd+scala2. DDD , Scala , DSL , ...
DDD 2 (4,5,6 )
@j5ik2o
6. Scala vs Java
Money Scala }
public BigDecimal getAmount() {
case class Money(amount :
BigDecimal, currency : Currency) return amount;
Money Java }
public class Money { public Currency getCurrency() {
private final BigDecimal amount; return currency;
}
private final Currency currency;
public Money(BigDecimal amnt, / equals, hashCode
/
Currency creny) { (ry
amount = amt;
}
currency = creny;
8. val
scala> val name = "Junichi Kato"
name: java.lang.String = Junichi Kato
scala> name = "JUNICHI KATO"
<console>:6: error: reassignment to val
name = "JUNICHI KATO"
9. var
scala> var name = "Junichi Kato"
name: java.lang.String = Junichi Kato
scala> name = "JUNICHI KATO"
name: java.lang.String = JUNICHI KATO
10. type
scala> val name = "Junichi Kato"
name: java.lang.String = Junichi Kato
scala> val name:String = "Junichi Kato"
name: String = Junichi Kato
scala> val num:Number = 100L
num: java.lang.Number = 100
12. if & for
if
val a = 10
val ret = if (a % 2 == 0) true else false
val ret = if (a % 2 == 0) { println(“ ”); true }
else { println(“ ”); false }
def isEven(n: Int) = if (n % 2 == 0) true else false
for
for(i <- 1 to 3) println(i) / 1,2,3
/
for(i <- Array(1,2,3)) println(i) / 1,2,3
/
val numbers = for(i <- 1 to 10) yield i
13. class
class PersonName
(fn: String, ln: String){
require(fn.length > 0) // IAE
require(ln.length > 0) // IAE
val firstName = fn
val lastName = ln
def fullName = “%s, %s”.format(firstName, lastName)
}
15. class
val pn = new PersonName(“Junichi”, “Kato”)
println(pn.fullName)
val pn2 = new PersonName(“”, “Kato”) / IAE
/
16. object
object EmployeeDao {
val DEFAULT_NAME = ...
def findAll = ...
}
val result = EmployeeDao.findAll
val defaultName = EmployeeDao.DEFAULT_NAME
17. { , }
class Money(val amount:BigDecimal, val currency: Currency) ...
object Money {
val JPY = Currency.getInstance(“JPY”)
def apply(amount: BigDecimal, currency: Currency) = new
Money(amount, currency)
}
val money:Money = Money(100, Money. JPY)
/ val money:Money = Money.apply(100, Money.JPY)
/
18. match
def numberMatch(n:Int) = n match {
case 1 => “one”
case 2 | 3 => “t wo or three”
case _ => “other”
}
println(numberMatch(1)) / one
/
println(numberMatch(2)) / t wo or three
/
println(numberMatch(3)) / t wo or three
/
println(numberMatch(4)) / other
/
19. match
val pattern = """([a-z]+)""".r case Array(1,2,3) => println(“
def matchTest(word: Any) = word 1,2,3 ”)
match {
case _ => throw new
case “ABC” => println(“ABC ”) IllegalArgumentException
case pattern(s) => println(" }
= "+s) matchTest(“ABC”) / ABC
/
case s: String => println(“ matchTest("aaaa") // =
= (%s)”.format(s)) (aaaa)
case n: Int if (n >= 2) => println(“2 matchTest(10) / 2
/
”)
matchTest(Array(1,2,3)) //
1,2,3
20. (a:Int) => a * a
val square: (Int) => Int = (a:Int) => a * a
val square = (a:Int) => a * a
val result = square(2) / 4
/
21. object MyMath {
def add(a:Int, b:Int) = a + b
}
val f1 = MyMath.add _
val f2: (Int,Int) => Int = MyMath.add
22. Collection
val il1 = List(1,2,3)
val il2 = list :+ 4 / 1,2,3,4
/
val im1 = Map(1 -> “ 2 -> “b”, 3 -> “c”)
a”,
val im2 = m1 + (4 -> “d”) / 1 -> “ 2 -> “b”, 3 -> “c”, 4 -> “d”
/ a”,
val ml = ListBuffer(1,2,3)
ml += 4
val mm = collection.mutalble.Map(1 -> “ 2 -> “b”, 3 -> “c”)
a”,
mm += (4 -> “d”)
23. Collection
val numbers = List(1,2,3,45)
numbers.foreach((n:Int) => println(n) ) / (1)
/
numbers.foreach(n => println(n)) / (2)
/
numbers.foreach(_ => println(_)) / (3)
/
numbers.foreach(println(_)) / (4)
/
numbers.foreach(println) / (5)
/
varl map = Map(1 -> “ 2 -> “b”)
a”,
map.foreach(entry => println(“key = %s, value =
%s”.format(entry._1,entry._2)))
25. Collection
Range ( (Seq) )
val range = 1 to 10; range.foreach(println)
for(i <- 1 to 10 by 2) println(i) / 1 3 5 7 9
/
6 FizzBuzz
(1 to 100).map{
case n if (n % 15 == 0) => “FizzBuzz”
case n if (n % 3 == 0) => “Fizz”
case n if (n % 5 == 0) => “Buzz”
case n => n
}.foreach(println)
26. trait
trait Greeting { def greet:Unit }
class JapaneseGreeting extends Greeting {
def greet = println(“ ”)
}
class EnglishGreeting extends Greeting {
def greet = println(“Hello”)
}
mix-in
trait Logging { def log(msg: String) = println(msg) }
class Employee(name:String) extends AbstractEmployee with
Logging {
log(“name = “+name)
}
29. Entity
trait Entity {
val id: String // OK
def equals(other: Any) = other match {
case that: Entity => id == that.id
case _ => false
}
def hashCode = id.hashCode
}
30. Entity
class Employee(val id: String, val name:
String)extends Entity
val kato1 = new Employee(“1”, “Junichi Kato”)
val kato2 = new Employee(“2”, “Junichi Kato”)
val kato3 = new Employee(“3”, “JUNICHI KATO”)
assert(kato1 != kato2)
assert(kato1 == kato3)
31. Entity with Factory
class Employee object Employee{
(val id:String, def apply(id:String,
name:String,
var name:String, dept:Department) = new
var dept:Department) Employee(id, name, dept)
extends Entity }
33. Value Object with Factory
class Money override def toString =
"Money(%s, %s)".format(amount,
(val amount: BigDecimal, currency)
val currency: Currency){ }
override def equals(that: Any): object Money {
Boolean = that match {
def apply(amount: BigDecimal,
case other: Money => amount == currency: Currency) = new
other.amount && currency == Money(amount, currency)
other.currency
def unapply(money: Money) =
case _ => false Some(money.amount,
} money.currency)
override def hashCode = }
amount.hashCode +
currency.hashCode
34. Value Object with Factory
VO
assert(Money(100, Money.JPY) == Money(100, Money.JPY))
assert(Money(100, Money.JPY) != Money(105, Money.JPY))
assert(Money(100, Money.JPY) != Money(100, Money.USD))
unapply
val Money(amt, cry) = money1_100yen
println(“
amount = %s, currency = %s”.format(amt, cry))
money1_100yen match { / match
/
case Money(amt, cry) => println(“
amount = %s, currency = %s”.format(amt,
cry))
case _ => ()
}
35. Value Object(case class)
case class Money(amount: BigDecimal, currency:
Currency)
apply, unapply
val
toString, equals, hashCode
VO case class Money(amount:
BigDecimal, currency: Currency) extends ValueObject
36. ValueObject Builder
case class PersonName(firstName: String, lastName:
String)
class PersonNameBuilder extends
ValueObjectBuidler[PersonName, PersonNameBuilder] { ... }
VO
val personName1 = new
PersonNameBuilder().withFirstName("Junichi").withLastNa
me("Kato").build
val personName2 = new
PersonNameBuilder().withLastName(lastName.toUpperCase
).build(personName1)
37. Service
object TransferSer vice {
def transfer(money: Money,
from:BankAccount, to:BankAccount) =
to.push(from.pull(money))
}
TransferService.transfer(Money(1000,JPY),
BankAccount(“012345”),
BankAccount(“543210”))
39. Aggregate
Department ( )
class Employee(val id:String, var name:String, var dept:
Department) extends Entity
class Department(val id: String, var name: String) extends Entity
val dept = Department(“1:1”, “DEV)
val emp = Employee(“1”, “KATO”, dept) / (1)
/
dept.name = “SALES” / (1)
/
val dept = emp.dept / (2)
/
dept.name = “SALES” / (2)
/
40. Aggregate(Cloneable)
@cloneable }
class Department(val id: String, var name: override def clone = { / (4)
/
String) extends Entity {
val result =
override def clone = super.clone.asInstanceOf[Employee]
super.clone.asInstanceOf[Department]
result.dpt = dpt.clone
}
}
@cloneable
}
class Employee(val id:String, var
val dept = Department(“1:1”, “DEV”)
name:String, _dpt: Department) extends
Entity { val emp = Employee(“1”, “KATO”, dept) / (1)
/
private var dpt = _dpt.clone / (1)
/ dept.name = “SALES”
def dept = dpt.clone / getDept
/ (2) val dept = emp.dept / (2)
/
def dept_= (value: Deaprtment) { // dept.name = “SALES”
setDept emp.dept = Department(“1:1”, “SALES”) / (3)
/
dpt = value.clone / (3)
/ val cloneEmp = emp.clone / (4)
/
41. Aggregate(clone)
clone Mix-in
@cloneable
trait EntityCloneable[T <: Entity] {
this: Entity =>
override def clone: T =
super.clone.asInstanceOf[T]
}
43. Aggregate(Factory)
Factory
object Department {
def apply(dept: Department) =
new Department(dept, dept.name)
}
object Employee {
def apply(emp: Employee) =
new Employee(emp.id, emp.name, Department(emp.dept))
}
val emp = Employee(“1”, “KATO”, Department(“1:1”, “DEV”))
val cloneEmp = Employee(emp)
44. Repository
trait EntityResolver[T <: Entity] extends Iterable[T]
{
def resolve(id: String): T
def apply(id: String) = resolve(id)
def contains(id: String): Boolean = exists(_.id == id)
def contains(entity: T): Boolean = exists(_ == entity)
}
45. Repository
class EmployeeResolver extends val er = new EmployeeResolver
EntityResolver[Employee] {
val employee = er.resolve(id)
private val employees =
val employee = er(id) / er.apply
/
Map(“1” -> Employee(“1”,
-> resolve
“KATO”, Department(“1:1”,
“DEV”))) val employee = er.contains(id)
def resolve(id: String) = val exists = er.exists(_.name ==
employees(id) “KATO”)
def iterator = val employees =
employees.map(e => er.filter(_.name.startWith(“K”))
e._2.clone).iterator
er.foreach(println)
}
46. Repository
trait Repository[T <: Entity] extends
EntityResolver[T] {
def store(entity: T)
def update(identifier: Identifier, entity:T) =
store(entity)
def delete(identity: Identifier)
def delete(entity: T)
}
47. Repository
class EmployeeRepository / resolve, iterator ...
/
extends
Repository[Employee] { }
private val employees = val er = new
collection.mutalble.Map.emp EmployeeRepository
ty[String, Employee] val emp = Employee(id,
def store(emp: Employee) = “KATO”, Department(“DEV))
employees += (emp.id -> emp) er.store(emp)
def delete(id: String) = er(id) = emp
employee -= emp.id
er.delete(id)
def delete(emp: Employee) =
delete(emp.id) er.delete(emp)
49. ( )=
id(4a74c322-08ab-450b-b674-793e1d7f399a) = class
Department {
package = dept
fields {
name = java.lang.String
}
}
50. package dept;
public class Department {
private java.lang.String name;
public void setName(java.lang.String name){
this.name = name;
}
public java.lang.String getName(){
return name;
}
}
51. (.ftl)
<#if classMeta.getPackageName()??> <#assign getter = "is"/>
package ${classMeta.getPackageName()}; <#elseif f.getTypeName() ==
"java.lang.Boolean">
</#if>
<#assign getter = "is"/>
public class ${classMeta.getName()} {
<#else>
<#list classMeta.getFieldMetas() as f>
<#assign getter = "get"/>
private ${f.getTypeName()} $
{f.getName()}; </#if>
public void set${f.getName()?cap_first} public ${f.getTypeName()} ${getter}$
(${f.getTypeName()} ${f.getName()}){ {f.getName()?cap_first}(){
this.${f.getName()} = $ return ${f.getName()};
{f.getName()};
}
}
</#list>
}
<#if f.getTypeName() == "boolean">
52. codegen -h
codegen -c sample.config -t template -e export
codegen -c [4a74c322-08ab-450b-
b674-793e1d7f399a]@sample.config -t
template -e export
53. ClassMeta
FieldMeta
CodeGenSer vice
Factory
ClassMetaRepository
54. ClassMeta Entity
package codegen.domain
class ClassMeta
(@BeanProperty val identifier: Identifier, @BeanProperty val name:
String,
val packageName: Option[String], val fieldMetas: List[FieldMeta])
extends Entity {
override def toString: String = "ClassMeta(%s, %s, %s,
%s)".format(identifier, name, packageName, fieldMetas)
def getPackageName(): String = if (packageName.isEmpty) null else
packageName.get
def getFieldMetas(): java.util.List[FieldMeta] = fieldMetas.asJava
}
55. ClassMeta Object
object ClassMeta {
def apply(identifier: Identifier, name: String, packageName: Option[String],
fieldMetas: List[FieldMeta]) =
new ClassMeta(identifier, name, packageName, fieldMetas)
def apply(name: String, packageName: Option[String], fieldMetas:
List[FieldMeta]): ClassMeta =
apply(Identifier(), name, packageName, fieldMetas)
def apply(classMeta: ClassMeta): ClassMeta =
apply(classMeta.identifier, classMeta.name, classMeta.packageName,
classMeta.fieldMetas)
def unapply(classMeta: ClassMeta) =
Some(classMeta.identifier, classMeta.name, classMeta.packageName,
classMeta.fieldMetas)
}
56. FieldMeta VO & VO Factory
case class FieldMeta(@BeanProperty name:
String, @BeanProperty typeName: String)
57. ClassMetaRepository
package codegen.domain
class ClassMetaRepository(configSource: BufferedSource)
extends EntityResolver[ClassMeta] {
private val classMetas = new
ModelParser().parse(configSource)
private val classMetaMap = classMetas.map(classMeta =>
(classMeta.identifier, classMeta)).toMap
def iterator: Iterator[ClassMeta] =
classMetaMap.map(classMeta => ClassMeta(_._2)).iterator
def resolve(identifier: Identifier): ClassMeta =
ClassMeta(classMetaMap(identifier))
}
58. CodeGenSer vice
package codegen.domain val exportClassDir =
getExportClassDir(classMeta)
object CodeGenSer vice{
exportClassDir.mkdirs
def generate(exportDir: File, templateDir: File,
classMetas: List[ClassMeta], using(new FileWriter(new
File(exportClassDir, classMeta.name + ".java"))) {
beginHandler: Option[(ClassMeta) => Unit],
fileWriter =>
endHandler: Option[(ClassMeta) => Unit] ) = {
template.process(rootMap.asJava,
val configuration = new Configuration fileWriter);
fileWriter.flush();
configuration.setDirectoryForTemplateLoading(te
mplateDir) } / using
/
val template = / ...
/
configuration.getTemplate("java.ftl")
} / foreach
/
classMetas.foreach {
}
classMeta =>
/ ...
/
/ ...
/
}
val rootMap = Map("classMeta" ->
classMeta)
59. Application
package codegen.application getExportDir(parameters),
object Application extends Logging { getIdList(parameters))
def main(args: Array[String]) { }
try {
val commandLine = new } catch {
CommandLineParser().parse(args.mkSt
ring(" ")) case e:
CommandLineParseException =>
commandLine match { println("
case Help() => println("""-c ")
[[id1,id2]@]file.config [-t templateDir]
[-e exportDir]""") }
case parameters: Parameters => }
generate(getConfigFile(parameters),
getTemplateDir(parameters), }
60. Application
private def generate(configFile: File, CodeGenSer vice.generate(exportDir, templateDir,
targets,
templateDir: File,
Some({
exportDir: File,
c => info("id(%s) : class %s
ids: List[String]) {
".format(c.identifier.value, c.name))
info("
= %s, = %s, }),
= %s".format(configFile, templateDir, Some({
exportDir)) c => info("id(%s) : class %s
val repos = new ".format(c.identifier.value, c.name))
ClassMetaRepository(Source.fromFile(configFile))
}))
val targets = ids match {
info(" ")
case Nil => repos.toList
case xs => xs.map { } catch {
e => repos.resolve(Identifier(e)) case e: Exception => error("
} ", e)
} }
try { }
Notes de l'éditeur &#x672C;&#x65E5;&#x306F;&#x4F11;&#x65E5;&#x306B;&#x3082;&#x95A2;&#x308F;&#x3089;&#x305A;&#x8DB3;&#x3092;&#x904B;&#x3093;&#x3067;&#x3044;&#x305F;&#x3060;&#x304D;&#x307E;&#x3057;&#x3066;&#x3001;&#x3042;&#x308A;&#x304C;&#x3068;&#x3046;&#x3054;&#x3056;&#x3044;&#x307E;&#x3059;&#x3002;\n&#x967D;&#x3068;&#x9670;&#x306E;&#x3001;&#x9670;&#x306E;&#x62C5;&#x5F53;&#x3068;&#x3044;&#x3046;&#x3053;&#x3068;&#x3067;&#x3001;&#x30DE;&#x30CB;&#x30A2;&#x30C3;&#x30AF;&#x306B;Scala&#x3067;DDD&#x3092;&#x3084;&#x308B;&#x306B;&#x306F;&#x3069;&#x3046;&#x3059;&#x308B;&#x304B;&#x3063;&#x3066;&#x30C6;&#x30FC;&#x30DE;&#x3067;&#x3044;&#x304D;&#x307E;&#x3059;&#x3002;\n DDD&#x7FFB;&#x8A33;&#x7248;&#x306E;&#x51FA;&#x7248;&#x304A;&#x3081;&#x3067;&#x3068;&#x3046;&#x3054;&#x3056;&#x3044;&#x307E;&#x3059;&#x3002;&#x6628;&#x5E74;&#x306E;DevLOVE&#x3067;&#x548C;&#x7530;&#x3055;&#x3093;&#x306B;&#x304A;&#x9858;&#x3044;&#x3057;&#x3066;&#x3001;&#x548C;&#x667A;&#x3055;&#x3093;&#x3092;&#x7D39;&#x4ECB;&#x3057;&#x3066;&#x8CB0;&#x3063;&#x3066;&#x3001;&#x79C1;&#x3068;&#x96A3;&#x3067;&#x3084;&#x3063;&#x3066;&#x3044;&#x308B;&#x90FD;&#x5143;&#x3055;&#x3093;&#x3067;2&#x90E8;(4,5,6&#x7AE0;)&#x306E;&#x30EC;&#x30D3;&#x30E5;&#x30FC;&#x3092;&#x62C5;&#x5F53;&#x3057;&#x307E;&#x3057;&#x305F;&#x3002;\n Scala&#x3067;DDD&#x3092;&#x3084;&#x308B;&#x306B;&#x306F;&#x3069;&#x3046;&#x3057;&#x305F;&#x3089;&#x3088;&#x3044;&#x304B;&#x3068;&#x3044;&#x3046;&#x30C6;&#x30FC;&#x30DE;&#x3067;&#x8A71;&#x3057;&#x307E;&#x3059;&#x3002;\n&#x307E;&#x305A;&#x306F;&#x3001;&#x307F;&#x306A;&#x3055;&#x3093;Java&#x304C;&#x308F;&#x304B;&#x308B;&#x524D;&#x63D0;&#x3067;Scala&#x65E9;&#x308F;&#x304B;&#x308A;&#x3067;&#x3056;&#x3063;&#x304F;&#x308A;&#x3068;&#x89E3;&#x8AAC;&#x3002;\n&#x305D;&#x306E;&#x5F8C;&#x3001;DDD+Scala&#x3067;&#x3059;&#x3002;&#x4E3B;&#x306B;DDD&#x306E;2&#x90E8;&#x306E;&#x8A71;&#x3092;&#x4E2D;&#x5FC3;&#x306B;Scala&#x3067;&#x3069;&#x3046;&#x5B9F;&#x8DF5;&#x3059;&#x308B;&#x304B;&#x3068;&#x3044;&#x3046;&#x30C6;&#x30FC;&#x30DE;&#x3067;&#x8A71;&#x3057;&#x307E;&#x3059;&#x3002;\n Scala&#x65E9;&#x308F;&#x304B;&#x308A;&#x3002;&#x7406;&#x5C48;&#x306F;&#x305D;&#x3053;&#x305D;&#x3053;&#x306B;&#x3001;&#x3056;&#x3063;&#x304F;&#x308A;&#x3068;&#x3069;&#x3093;&#x306A;&#x611F;&#x3058;&#x3067;&#x30B3;&#x30FC;&#x30C9;&#x3092;&#x66F8;&#x3051;&#x3070;&#x3088;&#x3044;&#x304B;&#x52D8;&#x6240;&#x3092;&#x7D39;&#x4ECB;&#x3057;&#x307E;&#x3059;&#x3002;\n &#x6700;&#x8FD1;&#x6D41;&#x884C;&#x3063;&#x3066;&#x3044;&#x308B;Scala&#x3067;&#x3059;&#x3002;&#x4ECA;&#x79C1;&#x3082;&#x65E5;&#x7D4C;&#x30BD;&#x30D5;&#x30C8;&#x30A6;&#x30A8;&#x30A2;&#x3067;Scala&#x306E;&#x7279;&#x96C6;&#x8A18;&#x4E8B;&#x3082;&#x66F8;&#x3044;&#x3066;&#x3044;&#x308B;&#x3050;&#x3089;&#x3044;&#x3067;&#x3059;&#x304B;&#x3089;&#x3001;&#x6CE8;&#x76EE;&#x3055;&#x308C;&#x3066;&#x3044;&#x308B;&#x8A00;&#x8A9E;&#x3067;&#x3059;&#x3002;&#x6CE8;&#x76EE;&#x3055;&#x308C;&#x3066;&#x3044;&#x308B;&#x7406;&#x7531;&#x306F;&#x3044;&#x308D;&#x3044;&#x308D;&#x3042;&#x308A;&#x307E;&#x3059;&#x304C;,Scala&#x306F;&#x3001;&#x95A2;&#x6570;&#x578B;&#x8A00;&#x8A9E;&#x306E;&#x6A5F;&#x80FD;&#x3092;&#x53D6;&#x308A;&#x8FBC;&#x3080;&#x3053;&#x3068;&#x3067;&#x3001;&#x7C21;&#x6F54;&#x3067;&#x660E;&#x77AD;&#x306A;&#x30B3;&#x30FC;&#x30C7;&#x30A3;&#x30F3;&#x30B0;&#x3001;&#x8A00;&#x8A9E;&#x81EA;&#x4F53;&#x306E;&#x62E1;&#x5F35;&#x6027;&#x3001;&#x30D0;&#x30B0;&#x3092;&#x4F5C;&#x308A;&#x8FBC;&#x307F;&#x306B;&#x304F;&#x3044;&#x30D7;&#x30ED;&#x30B0;&#x30E9;&#x30DF;&#x30F3;&#x30B0;&#x30B9;&#x30BF;&#x30A4;&#x30EB;&#x3001;&#x4E26;&#x884C;&#x51E6;&#x7406;&#x5411;&#x304D;&#x306A;&#x3069;&#x3001;&#x30AA;&#x30D6;&#x30B8;&#x30A7;&#x30AF;&#x30C8;&#x6307;&#x5411;&#x3068;&#x306F;&#x7570;&#x306A;&#x308B;&#x7279;&#x5FB4;&#x3092;&#x6301;&#x3063;&#x3066;&#x3044;&#x307E;&#x3059;&#x3002;&#x3042;&#x307E;&#x308A;&#x8A73;&#x3057;&#x304F;&#x8AAC;&#x660E;&#x3059;&#x308B;&#x3068;&#x3053;&#x308C;&#x3060;&#x3051;&#x3067;&#x7D42;&#x308F;&#x3063;&#x3066;&#x3057;&#x307E;&#x3046;&#x306E;&#x3067;&#x3001;&#x3053;&#x306E;&#x30BB;&#x30C3;&#x30B7;&#x30E7;&#x30F3;&#x3067;&#x5FC5;&#x8981;&#x6700;&#x4F4E;&#x9650;&#x306E;&#x77E5;&#x8B58;&#x3060;&#x3051;&#x3092;&#x3044;&#x308C;&#x3066;Scala&#x3068;DDD&#x3092;&#x8003;&#x3048;&#x3066;&#x307F;&#x307E;&#x3057;&#x3087;&#x3046;&#x3002;\n &#x304A;&#x91D1;&#x3092;&#x8868;&#x3059;Money&#x30AF;&#x30E9;&#x30B9;(amount&#x306F;&#x304A;&#x91D1;&#x306E;&#x91CF;, currency&#x306F;&#x901A;&#x8CA8;&#x5358;&#x4F4D;)\nScala&#x306F;Java&#x306E;&#x4E16;&#x754C;&#x306B;&#x660E;&#x77AD;&#x3067;&#x7C21;&#x6F54;&#x3092;&#x3082;&#x305F;&#x3089;&#x3057;&#x307E;&#x3059;&#x3002;\n &#x304A;&#x306A;&#x3058;&#x307F;&#x306A;HelloWorld&#x3067;&#x3059;&#x304C;&#x3002;\n&#x307E;&#x305A;object&#x304C;&#x51FA;&#x3066;&#x304D;&#x307E;&#x3057;&#x305F;&#x3002;Java&#x306B;&#x306F;&#x306A;&#x3044;&#x3067;&#x3059;&#x3002;&#x4F55;&#x304B;&#x3068;&#x3044;&#x3046;&#x3068;&#x30B7;&#x30F3;&#x30B0;&#x30EB;&#x30C8;&#x30F3;&#x3067;&#x3059;&#x3002;&#x30A4;&#x30F3;&#x30B9;&#x30BF;&#x30F3;&#x30B9;&#x304C;&#x4E00;&#x3064;&#x3057;&#x304B;&#x4F5C;&#x308C;&#x306A;&#x3044;&#x30AA;&#x30D6;&#x30B8;&#x30A7;&#x30AF;&#x30C8;&#x3067;&#x3059;&#x306D;&#x3002;&#x3053;&#x308C;&#x304C;&#x3042;&#x308B;&#x306E;&#x3067;&#x3001;Scala&#x3067;&#x306F;static&#x304C;&#x3042;&#x308A;&#x307E;&#x305B;&#x3093;&#x3002;\ndef&#x304B;&#x3089;&#x59CB;&#x307E;&#x308B;&#x306E;&#x304C;&#x30E1;&#x30BD;&#x30C3;&#x30C9;&#x3067;&#x3059;&#x3002;Ruby, Python&#x306B;&#x8FD1;&#x3044;&#x3067;&#x3059;&#x306D;&#x3002;main&#x3082;static&#x306A;&#x3057;&#x3067;&#x8A18;&#x8FF0;&#x3057;&#x307E;&#x3059;&#x3002;&#x5F15;&#x6570;&#x306F;&#x30E1;&#x30BD;&#x30C3;&#x30C9;&#x540D;&#x306E;&#x5F8C;&#x308D;&#x306B;&#x66F8;&#x304D;&#x307E;&#x3059;&#x304C;&#x3001;&#x578B;&#x540D;&#x306F;&#x5909;&#x6570;&#x540D;&#x306E;&#x5F8C;&#x308D;&#x306B;&#x8A18;&#x8FF0;&#x3057;&#x307E;&#x3059;&#x3002;&#x914D;&#x5217;&#x306F;Array&#x578B;&#x3092;&#x4F7F;&#x3044;&#x307E;&#x3059;&#x3002;[]&#x306E;&#x30D6;&#x30E9;&#x30B1;&#x30C3;&#x30C8;&#x306F;&#x30B8;&#x30A7;&#x30CD;&#x30EA;&#x30C3;&#x30AF;&#x30B9;&#x306E;&#x578B;&#x5909;&#x6570;&#x3092;&#x6307;&#x5B9A;&#x3057;&#x3066;&#x3044;&#x307E;&#x3059;&#x3002;&#x30E1;&#x30BD;&#x30C3;&#x30C9;&#x306E;&#x5F8C;&#x308D;&#x306B;&#x3042;&#x308B;&#x306E;&#x304C;&#x30E1;&#x30BD;&#x30C3;&#x30C9;&#x306E;&#x623B;&#x308A;&#x5024;&#x306E;&#x578B;&#x3067;&#x3059;&#x3002;&#x95A2;&#x6570;&#x306E;&#x672C;&#x4F53;&#x306F;&#xFF1D;&#x306E;&#x5F8C;&#x308D;&#x306B;&#x7D9A;&#x3051;&#x3066;&#x8A18;&#x8FF0;&#x3057;&#x307E;&#x3059;&#x3002;public&#x30AD;&#x30FC;&#x30EF;&#x30FC;&#x30C9;&#x304C;&#x306A;&#x3044;&#x3067;&#x3059;&#x304C;&#x3001;&#x30C7;&#x30D5;&#x30A9;&#x30EB;&#x30C8;&#x306E;&#x30A2;&#x30AF;&#x30BB;&#x30B9;&#x8846;&#x529B;&#x3057;&#x306F;public&#x306A;&#x306E;&#x3067;&#x308F;&#x3056;&#x308F;&#x3056;&#x4ED8;&#x3051;&#x308B;&#x5FC5;&#x8981;&#x304C;&#x3042;&#x308A;&#x307E;&#x305B;&#x3093;&#x3002;\n Scala&#x3067;&#x306F;val&#x3068;var&#x3092;&#x4F7F;&#x3063;&#x3066;&#x5909;&#x6570;&#x3092;&#x5BA3;&#x8A00;&#x3057;&#x307E;&#x3059;&#x3002;\nval&#x306F;Java&#x306E;final&#x5909;&#x6570;&#x3068;&#x540C;&#x3058;&#x3067;&#x3059;&#x3002;&#x518D;&#x4EE3;&#x5165;&#x304C;&#x3067;&#x304D;&#x307E;&#x305B;&#x3093;&#x3002;&#x5B9A;&#x6570;&#x3067;&#x3059;&#x306D;&#x3002;\n\n var&#x306F;&#x901A;&#x5E38;&#x306E;&#x5909;&#x6570;&#x3067;&#x3059;&#x3002;&#x518D;&#x4EE3;&#x5165;&#x53EF;&#x80FD;&#x3067;&#x3059;&#x3002;\n&#x95A2;&#x6570;&#x578B;&#x30D7;&#x30ED;&#x30B0;&#x30E9;&#x30DF;&#x30F3;&#x30B0;&#x306E;&#x30B9;&#x30BF;&#x30A4;&#x30EB;&#x3092;&#x884C;&#x3046;&#x5834;&#x5408;&#x306F;val&#x304C;&#x57FA;&#x672C;&#x306B;&#x306A;&#x308A;&#x307E;&#x3059;&#x3002;&#x3064;&#x307E;&#x308A;&#x4E0D;&#x5909;&#x6027;&#x3092;&#x91CD;&#x8996;&#x3057;&#x305F;&#x30B9;&#x30BF;&#x30A4;&#x30EB;&#x306B;&#x306A;&#x308A;&#x307E;&#x3059;&#x3002;&#x9006;&#x306B;Java&#x306A;&#x3069;&#x306E;&#x72B6;&#x614B;&#x3092;&#x6271;&#x3046;&#x547D;&#x4EE4;&#x578B;&#x30D7;&#x30ED;&#x30B0;&#x30E9;&#x30DF;&#x30F3;&#x30B0;&#x306E;&#x30B9;&#x30BF;&#x30A4;&#x30EB;&#x306E;&#x5834;&#x5408;&#x306F;var&#x3092;&#x5229;&#x7528;&#x3057;&#x307E;&#x3059;&#x3002;\n&#x3053;&#x308C;&#x3089;&#x306F;&#x3069;&#x3061;&#x3089;&#x304C;&#x3044;&#x3044;&#x3068;&#x304B;&#x60AA;&#x3044;&#x3068;&#x304B;&#x306F;&#x306A;&#x304F;&#x3001;&#x9069;&#x6750;&#x9069;&#x6240;&#x3060;&#x3068;&#x601D;&#x3044;&#x307E;&#x3059;&#x3002;&#x30D7;&#x30ED;&#x30B0;&#x30E9;&#x30E0;&#x306E;&#x308F;&#x304B;&#x308A;&#x3084;&#x3059;&#x3055;&#x3001;&#x4E0D;&#x5177;&#x5408;&#x3092;&#x4F5C;&#x308A;&#x3053;&#x307E;&#x306A;&#x3044;&#x3088;&#x3046;&#x306B;&#x3059;&#x308B;&#x3068;&#x304B;&#x3001;&#x4E26;&#x884C;&#x6027;&#x3092;&#x91CD;&#x8996;&#x3059;&#x308B;&#x5834;&#x5408;&#x306F;val&#x304C;&#x57FA;&#x672C;&#x306B;&#x306A;&#x3063;&#x3066;&#x304F;&#x308B;&#x3068;&#x601D;&#x3044;&#x307E;&#x3059;&#x3002;\n name&#x306F;&#x6587;&#x5B57;&#x5217;&#x3002;&#x6587;&#x5B57;&#x5217;&#x578B;&#x306F;java.lang.String&#x30AF;&#x30E9;&#x30B9;&#x3002;\n&#x578B;&#x306F;&#x30B3;&#x30F3;&#x30D1;&#x30A4;&#x30E9;&#x306B;&#x3088;&#x3063;&#x3066;&#x63A8;&#x8AD6;&#x3055;&#x308C;&#x308B;&#x3002;\n&#x578B;&#x30A2;&#x30CE;&#x30C6;&#x30FC;&#x30B7;&#x30E7;&#x30F3;&#x3092;&#x4F7F;&#x3063;&#x3066;&#x660E;&#x793A;&#x7684;&#x306B;&#x6307;&#x5B9A;&#x3067;&#x304D;&#x308B;\n HelloWorld&#x306E;&#x4F8B;&#x3067;&#x8AAC;&#x660E;&#x3057;&#x305F;&#x901A;&#x308A;&#x3067;&#x3059;&#x3002;\n&#x8DB3;&#x3057;&#x7B97;&#x3059;&#x308B;&#x30E1;&#x30BD;&#x30C3;&#x30C9;&#x306E;&#x4F8B;&#x3067;&#x3059;&#x3002;return a + b&#x3067;&#x3059;&#x304C;&#x3001;&#x30E1;&#x30BD;&#x30C3;&#x30C9;&#x306E;&#x6700;&#x5F8C;&#x306E;&#x5F0F;&#x306E;&#x5024;&#x304C;&#x623B;&#x308A;&#x5024;&#x306B;&#x306A;&#x308A;&#x307E;&#x3059;&#x3002;&#x305D;&#x306E;&#x5834;&#x5408;&#x306F;return&#x30AD;&#x30FC;&#x30EF;&#x30FC;&#x30C9;&#x306F;&#x4E0D;&#x8981;&#x3067;&#x3059;&#x3002;&#x307E;&#x305F;&#x4E00;&#x3064;&#x306E;&#x5F0F;&#x3067;&#x7D42;&#x308F;&#x308B;&#x5834;&#x5408;&#x306F;&#x4E2D;&#x62EC;&#x5F27;&#x306F;&#x4E0D;&#x8981;&#x3067;&#x3059;&#x3002;&#x307E;&#x305F;&#x3001;&#x5F0F;&#x304B;&#x3089;&#x623B;&#x308A;&#x5024;&#x304C;&#x578B;&#x63A8;&#x8AD6;&#x3067;&#x304D;&#x308B;&#x5834;&#x5408;&#x306F;&#x30E1;&#x30BD;&#x30C3;&#x30C9;&#x306E;&#x623B;&#x308A;&#x5024;&#x306E;&#x578B;&#x3082;&#x7701;&#x7565;&#x3067;&#x304D;&#x307E;&#x3059;&#x3002;\n if&#x5F0F;&#x3068;for&#x5F0F;&#x3067;&#x3059;&#x3002;&#x6587;&#x3067;&#x306F;&#x306A;&#x304F;&#x5F0F;&#x306B;&#x306A;&#x3063;&#x3066;&#x3044;&#x307E;&#x3059;&#x3002;&#x5F0F;&#x306F;&#x5024;&#x3092;&#x8A55;&#x4FA1;&#x3057;&#x8FD4;&#x3057;&#x307E;&#x3059;&#x3002;\nif&#x5F0F;&#x306F;Java&#x306E;&#x4E09;&#x9805;&#x6F14;&#x7B97;&#x5B50;&#x307F;&#x305F;&#x3044;&#x306A;&#x611F;&#x3058;&#x3002;&#x30E1;&#x30BD;&#x30C3;&#x30C9;&#x306E;=&#x306B;&#x7D9A;&#x3051;&#x3066;&#x7C21;&#x6F54;&#x306B;&#x8A18;&#x8FF0;&#x3067;&#x304D;&#x307E;&#x3059;&#x3002;\nfor&#x5F0F;&#x306F;Java&#x3068;&#x540C;&#x69D8;&#x7E70;&#x308A;&#x8FD4;&#x3057;&#x51E6;&#x7406;&#x3067;&#x4F7F;&#x3048;&#x307E;&#x3059;&#x3002;&#x307E;&#x305F;yield(&#x30A4;&#x30FC;&#x30EB;&#x30C9;)&#x3067;&#x8FD4;&#x3057;&#x305F;&#x5024;&#x3092;&#x683C;&#x7D0D;&#x3057;&#x305F;&#x30B3;&#x30EC;&#x30AF;&#x30B7;&#x30E7;&#x30F3;&#x3092;&#x8FD4;&#x3059;&#x3053;&#x3068;&#x304C;&#x3067;&#x304D;&#x307E;&#x3059;&#x3002;\n &#x6B21;&#x306F;&#x30AF;&#x30E9;&#x30B9;&#x3067;&#x3059;&#x3002;&#x30AF;&#x30E9;&#x30B9;&#x540D;&#x306E;&#x5F8C;&#x308D;&#x306B;&#x30B3;&#x30F3;&#x30B9;&#x30C8;&#x30E9;&#x30AF;&#x30BF;&#x306E;&#x5F15;&#x6570;&#x30EA;&#x30B9;&#x30C8;&#x3092;&#x66F8;&#x304D;&#x307E;&#x3059;&#x3002;\n&#x305D;&#x3057;&#x3066;&#x30AF;&#x30E9;&#x30B9;&#x306E;&#x30D6;&#x30ED;&#x30C3;&#x30AF;&#x304C;&#x30B3;&#x30F3;&#x30B9;&#x30C8;&#x30E9;&#x30AF;&#x30BF;&#x30D6;&#x30ED;&#x30C3;&#x30AF;&#x3067;&#x3059;&#x3002;&#x305D;&#x3053;&#x306B;&#x5BA3;&#x8A00;&#x3057;&#x305F;&#x5909;&#x6570;&#x304C;&#x30D5;&#x30A3;&#x30FC;&#x30EB;&#x30C9;&#x306B;&#x306A;&#x308A;&#x307E;&#x3059;&#x3002;firstName&#x3068;lastName&#x304C;public&#x30D5;&#x30A3;&#x30FC;&#x30EB;&#x30C9;&#x3067;&#x3059;&#x3002;\n \n Java&#x3068;&#x540C;&#x69D8;&#x306B;new&#x3057;&#x3066;&#x4F7F;&#x3044;&#x307E;&#x3059;&#x3002;\n HelloWorld&#x3067;&#x3082;&#x8AAC;&#x660E;&#x3057;&#x305F;object&#x3067;&#x3059;&#x304C;&#x3001;new&#x305B;&#x305A;&#x306B;&#x30B7;&#x30F3;&#x30B0;&#x30EB;&#x30C8;&#x30F3;&#x30AA;&#x30D6;&#x30B8;&#x30A7;&#x30AF;&#x30C8;&#x3068;&#x3057;&#x3066;&#x4F7F;&#x3048;&#x307E;&#x3059;&#x3002;static&#x306E;&#x4EE3;&#x308F;&#x308A;&#x306B;&#x4F7F;&#x3048;&#x307E;&#x3059;&#x3002;&#x30B3;&#x30F3;&#x30B9;&#x30C8;&#x30E9;&#x30AF;&#x30BF;&#x306F;&#x5B9A;&#x7FA9;&#x3067;&#x304D;&#x307E;&#x305B;&#x3093;&#x3002;\n Scala&#x306B;&#x306F;&#x30B3;&#x30F3;&#x30D1;&#x30CB;&#x30AA;&#x30F3;&#x30AF;&#x30E9;&#x30B9;&#x3068;&#x30B3;&#x30F3;&#x30D1;&#x30CB;&#x30AA;&#x30F3;&#x30AA;&#x30D6;&#x30B8;&#x30A7;&#x30AF;&#x30C8;&#x3068;&#x3044;&#x3046;&#x6A5F;&#x80FD;&#x304C;&#x3042;&#x308A;&#x307E;&#x3059;&#x3002;\n&#x540C;&#x3058;&#x30D5;&#x30A1;&#x30A4;&#x30EB;&#x304B;&#x540C;&#x3058;&#x30D1;&#x30C3;&#x30B1;&#x30FC;&#x30B8;&#x306B;&#x3042;&#x308B;&#x540C;&#x3058;&#x540D;&#x524D;&#x306E;&#x30AF;&#x30E9;&#x30B9;&#x3068;&#x30AA;&#x30D6;&#x30B8;&#x30A7;&#x30AF;&#x30C8;&#x306E;&#x3053;&#x3068;&#x3067;&#x3059;&#x3002;\nJava&#x3060;&#x3068;&#x540D;&#x524D;&#x7A7A;&#x9593;&#x3067;&#x885D;&#x7A81;&#x3057;&#x307E;&#x3059;&#x304C;&#x3001;Scala&#x3067;&#x306F;&#x3057;&#x307E;&#x305B;&#x3093;&#x3002;\n&#x3053;&#x306E;&#x304A;&#x91D1;&#x306E;Money&#x30AF;&#x30E9;&#x30B9;&#x306B;&#x5BFE;&#x3057;&#x3066;&#x3001;Money&#x30AA;&#x30D6;&#x30B8;&#x30A7;&#x30AF;&#x30C8;&#x304C;&#x3042;&#x308A;&#x3001;JPY&#x3068;&#x3044;&#x3046;&#x5B9A;&#x6570;&#x3084;&#x3001;apply&#x30E1;&#x30BD;&#x30C3;&#x30C9;&#x3092;&#x63D0;&#x4F9B;&#x3057;&#x3066;&#x3044;&#x307E;&#x3059;&#x3002;Money.JPY&#x306F;&#x30AF;&#x30E9;&#x30B9;&#x5074;&#x306B;&#x306F;&#x5B9A;&#x7FA9;&#x3067;&#x304D;&#x306A;&#x3044;&#x306E;&#x3067;&#x3001;&#x30B3;&#x30F3;&#x30D1;&#x30CB;&#x30AA;&#x30F3;&#x30AA;&#x30D6;&#x30B8;&#x30A7;&#x30AF;&#x30C8;&#x306B;&#x5B9A;&#x7FA9;&#x3057;&#x3066;&#x3044;&#x307E;&#x3059;&#x3002;&#x307E;&#x305F;&#x3001;apply&#x306F;&#x30D5;&#x30A1;&#x30AF;&#x30C8;&#x30EA;&#x30E1;&#x30BD;&#x30C3;&#x30C9;&#x3067;&#x3059;&#x3002;\nappy&#x30E1;&#x30BD;&#x30C3;&#x30C9;&#x306F;&#x7CD6;&#x8863;&#x69CB;&#x6587;&#x306B;&#x3088;&#x3063;&#x3066;&#x7701;&#x7565;&#x3057;&#x3066;&#x8A18;&#x8FF0;&#x3067;&#x304D;&#x307E;&#x3059;&#x3002;new&#x3059;&#x308B;&#x5FC5;&#x8981;&#x304C;&#x306A;&#x304F;&#x306A;&#x308A;&#x3001;&#x8A18;&#x8FF0;&#x6027;&#x304C;&#x9AD8;&#x307E;&#x308A;&#x307E;&#x3059;&#x3002;\n Scala&#x3067;&#x306F;match&#x5F0F;&#x3092;&#x4F7F;&#x3046;&#x3053;&#x3068;&#x3067;&#x69D8;&#x3005;&#x306A;&#x3082;&#x306E;&#x3092;&#x30D1;&#x30BF;&#x30FC;&#x30F3;&#x30DE;&#x30C3;&#x30C1;&#x3067;&#x304D;&#x307E;&#x3059;&#x3002;Java&#x306E;swtich&#x6587;&#x306B;&#x4F3C;&#x3066;&#x3044;&#x307E;&#x3059;&#x304C;&#x3001;&#x305D;&#x308C;&#x3092;&#x8D85;&#x8D8A;&#x3057;&#x305F;&#x5F0F;&#x3067;&#x3059;&#x3002;\n&#x3053;&#x308C;&#x306F;switch&#x6587;&#x3067;&#x304A;&#x99B4;&#x67D3;&#x307F;&#x306E;&#x6570;&#x5024;&#x306E;&#x30DE;&#x30C3;&#x30C1;&#x30F3;&#x30B0;&#x3067;&#x3059;&#x3002;n&#x3092;&#x30BB;&#x30EC;&#x30AF;&#x30BF;&#x30FC;&#x3068;&#x3044;&#x3044;&#x307E;&#x3059;&#x304C;&#x3001;match&#x5F0F;&#x306E;&#x4E2D;&#x306E;case&#x305D;&#x308C;&#x305E;&#x308C;&#x304C;&#x6761;&#x4EF6;&#x3067;&#x3059;&#x3002;=>&#x4EE5;&#x964D;&#x306B;&#x5F0F;&#x3092;&#x66F8;&#x304D;&#x307E;&#x3059;&#x3002;&#x305D;&#x306E;&#x5F0F;&#x306F;&#x8A55;&#x4FA1;&#x3055;&#x308C;&#x3066;match&#x5F0F;&#x306E;&#x623B;&#x308A;&#x5024;&#x306B;&#x306A;&#x308A;&#x307E;&#x3059;&#x3002;\n &#x6570;&#x5024;&#x4EE5;&#x5916;&#x306B;&#x3082;&#x6587;&#x5B57;&#x5217;&#x3084;&#x3001;&#x578B;&#x3001;&#x30B3;&#x30EC;&#x30AF;&#x30B7;&#x30E7;&#x30F3;&#x3001;&#x6B63;&#x898F;&#x8868;&#x73FE;&#x306B;&#x3082;&#x30DE;&#x30C3;&#x30C1;&#x3055;&#x305B;&#x308B;&#x3053;&#x3068;&#x304C;&#x3067;&#x304D;&#x307E;&#x3059;&#x3002;&#x304B;&#x306A;&#x308A;&#x5F37;&#x529B;&#x306A;&#x306E;&#x3067;&#x3001;Scala&#x3067;&#x306F;if&#x5F0F;&#x306F;&#x307B;&#x3068;&#x3093;&#x3069;&#x4F7F;&#x3044;&#x307E;&#x305B;&#x3093;&#x3002;\n &#x30E1;&#x30BD;&#x30C3;&#x30C9;&#x306F;&#x30AF;&#x30E9;&#x30B9;&#x306B;&#x7D10;&#x3065;&#x304F;&#x3082;&#x306E;&#x3067;&#x3059;&#x3001;&#x95A2;&#x6570;&#x306F;&#x72EC;&#x7ACB;&#x3057;&#x3066;&#x3044;&#x307E;&#x3059;&#x3002;\n&#xFF11;&#x3064;&#x4EE5;&#x4E0A;&#x306E;&#x5F15;&#x6570;&#x3092;&#x3068;&#x308A;&#xFF11;&#x3064;&#x306E;&#x7D50;&#x679C;&#x3092;&#x751F;&#x6210;&#x3059;&#x308B;&#x30DE;&#x30C3;&#x30D4;&#x30F3;&#x30B0;&#x306A;&#x3069;&#x3068;&#x4F8B;&#x3048;&#x3089;&#x308C;&#x3066;&#x3044;&#x307E;&#x3059;&#x3002;\nScala&#x3067;&#x306F;&#x95A2;&#x6570;&#x30EA;&#x30C6;&#x30E9;&#x30EB;&#x3068;&#x3044;&#x3046;&#x8A18;&#x8FF0;&#x65B9;&#x6CD5;&#x3067;&#x95A2;&#x6570;&#x3092;&#x5B9A;&#x7FA9;&#x3057;&#x307E;&#x3059;&#x3002;a&#x3092;&#x4E8C;&#x4E57;&#x3059;&#x308B;&#x95A2;&#x6570;&#x3067;&#x3059;&#x3002;&#x540D;&#x524D;&#x304C;&#x306A;&#x3044;&#x306E;&#x3067;&#x3001;&#x7121;&#x540D;&#x95A2;&#x6570;&#x3068;&#x3082;&#x547C;&#x3070;&#x308C;&#x307E;&#x3059;&#x3002;&#x3053;&#x306E;&#x7121;&#x540D;&#x95A2;&#x6570;&#x3092;&#x5909;&#x6570;&#x306B;&#x4EE3;&#x5165;&#x3059;&#x308B;&#x3053;&#x3068;&#x304C;&#x3067;&#x304D;&#x307E;&#x3059;&#x3002;&#x4ED6;&#x306E;&#x95A2;&#x6570;&#x3084;&#x30E1;&#x30BD;&#x30C3;&#x30C9;&#x306E;&#x623B;&#x308A;&#x5024;&#x3084;&#x5F15;&#x6570;&#x306B;&#x53D6;&#x308B;&#x3053;&#x3068;&#x304C;&#x3067;&#x304D;&#x307E;&#x3059;&#x3002;&#x95A2;&#x6570;&#x578B;&#x8A00;&#x8A9E;&#x3067;&#x306F;&#x3001;&#x95A2;&#x6570;&#x5358;&#x4F53;&#x3092;&#x5236;&#x9650;&#x306A;&#x304F;&#x5229;&#x7528;&#x53EF;&#x80FD;&#x3067;&#x3059;&#x3002;&#x4E00;&#x4EBA;&#x524D;&#x306E;&#x30AA;&#x30D6;&#x30B8;&#x30A7;&#x30AF;&#x30C8;&#x3068;&#x3044;&#x3044;&#x307E;&#x3059;&#x3002;\nsquare&#x306F;&#x95A2;&#x6570;&#x540D;&#x3067;&#x306F;&#x306A;&#x304F;&#x3001;&#x7121;&#x540D;&#x95A2;&#x6570;&#x3078;&#x306E;&#x53C2;&#x7167;&#x306E;&#x540D;&#x524D;&#x3067;&#x3059;&#x3002;&#x95A2;&#x6570;&#x306E;&#x578B;&#x306F;&#x578B;&#x63A8;&#x8AD6;&#x3067;&#x7701;&#x7565;&#x53EF;&#x80FD;&#x3067;&#x3059;&#x3002;&#x547C;&#x3073;&#x51FA;&#x3057;&#x3082;&#x7C21;&#x5358;&#x306B;&#x3067;&#x304D;&#x307E;&#x3059;&#x3002;\n\n\n &#x30AF;&#x30E9;&#x30B9;&#x306B;&#x7D10;&#x3065;&#x304F;&#x30E1;&#x30BD;&#x30C3;&#x30C9;&#x3092;&#x95A2;&#x6570;&#x306B;&#x5909;&#x63DB;&#x3059;&#x308B;&#x306E;&#x306F;&#x7C21;&#x5358;&#x3067;&#x3059;&#x3002;&#x30E1;&#x30BD;&#x30C3;&#x30C9;&#x540D;&#x306E;&#x5F8C;&#x308D;&#x306B; _&#x3092;&#x4ED8;&#x3051;&#x307E;&#x3059;&#x3002;&#x3082;&#x3057;&#x304F;&#x306F;&#x95A2;&#x6570;&#x306E;&#x578B;&#x30A2;&#x30CE;&#x30C6;&#x30FC;&#x30B7;&#x30E7;&#x30F3;&#x3092;&#x6307;&#x5B9A;&#x3059;&#x308B;&#x3068;&#x3088;&#x3044;&#x3067;&#x3059;&#x3002;\n &#x30B3;&#x30EC;&#x30AF;&#x30B7;&#x30E7;&#x30F3;&#x306F;&#x4E0D;&#x5909;&#x3068;&#x53EF;&#x5909;&#x304C;&#x3042;&#x308A;&#x307E;&#x3059;&#x3002;\n &#x6B21;&#x306F;&#x8981;&#x7D20;&#x306E;&#x7E70;&#x308A;&#x8FD4;&#x3057;&#x51E6;&#x7406;&#x3067;&#x3059;&#x3002;\n(1)foreach&#x306F;&#x95A2;&#x6570;&#x3092;&#x5F15;&#x6570;&#x306B;&#x53D6;&#x308A;&#x307E;&#x3059;&#x3002;&#x5F15;&#x6570;&#x304C;&#x8981;&#x7D20;&#x578B;&#x3067;&#x623B;&#x308A;&#x5024;&#x306F;Unit&#x3067;&#x3059;&#x3002;&#x8981;&#x7D20;&#x6BCE;&#x306B;&#x305D;&#x306E;&#x95A2;&#x6570;&#x3092;&#x547C;&#x3073;&#x51FA;&#x3057;&#x307E;&#x3059;&#x3002;(2)&#x5F15;&#x6570;&#x306E;&#x578B;&#x6307;&#x5B9A;&#x3068;&#x62EC;&#x5F27;&#x306F;&#x7701;&#x7565;&#x3067;&#x304D;&#x307E;&#x3059;&#x3002;(3)&#x5F15;&#x6570;&#x3092;&#x30D7;&#x30EC;&#x30FC;&#x30B9;&#x30DB;&#x30EB;&#x30C0;&#x306B;&#x7F6E;&#x304D;&#x63DB;&#x3048;&#x308B;&#x3053;&#x3068;&#x304C;&#x3067;&#x304D;&#x307E;&#x3059;&#x3002;(4)&#x30D7;&#x30EC;&#x30FC;&#x30B9;&#x30DB;&#x30EB;&#x30C0;&#x304C;&#x4E00;&#x5EA6;&#x3057;&#x304B;&#x51FA;&#x3066;&#x3053;&#x306A;&#x3044;&#x5834;&#x5408;&#x306F;&#x5F15;&#x6570;=>&#x3092;&#x7701;&#x7565;&#x3067;&#x304D;&#x307E;&#x3059;&#x3002;(5)println&#x6587;&#x306E;&#x5F15;&#x6570;&#x304C;&#xFF11;&#x3064;&#x3067;&#x3042;&#x308B;&#x5834;&#x5408;&#x306F;&#x30D7;&#x30EC;&#x30FC;&#x30B9;&#x30DB;&#x30EB;&#x30C0;&#x81EA;&#x4F53;&#x3092;&#x7701;&#x7565;&#x53EF;&#x80FD;&#x3067;&#x3059;&#x3002;\n&#x3061;&#x306A;&#x307F;&#x306B;&#x3001;map&#x3082;&#x7E70;&#x308A;&#x8FD4;&#x3057;&#x64CD;&#x4F5C;&#x304C;&#x53EF;&#x80FD;&#x3067;&#x3059;&#x3002;Java&#x306E;Map.Entry&#x306B;&#x76F8;&#x5F53;&#x3057;&#x307E;&#x3059;&#x3002;_1&#x304C;&#x30AD;&#x30FC;&#x3067;&#x3001;_2&#x304C;&#x5024;&#x3067;&#x3059;&#x3002;&#x8907;&#x6570;&#x306E;&#x5024;&#x3092;&#x3072;&#x3068;&#x307E;&#x3068;&#x3081;&#x306B;&#x3059;&#x308B;&#x30BF;&#x30D7;&#x30EB;&#x3068;&#x3044;&#x3046;&#x3082;&#x306E;&#x3067;&#x3059;&#x304C;&#x3001;Map&#x306F;&#x30BF;&#x30D7;&#x30EB;&#x306E;Iterable&#x3092;&#x5B9F;&#x88C5;&#x3057;&#x3066;&#x3044;&#x308B;&#x306E;&#x3067;List&#x306E;&#x3088;&#x3046;&#x306B;&#x6271;&#x3046;&#x3053;&#x3068;&#x304C;&#x3067;&#x304D;&#x307E;&#x3059;&#x3002;\n &#x4ED6;&#x306B;&#x3082;&#x4FBF;&#x5229;&#x30E1;&#x30BD;&#x30C3;&#x30C9;&#x304C;&#x3042;&#x308A;&#x307E;&#x3059;&#x3002;&#x7279;&#x5B9A;&#x306E;&#x6761;&#x4EF6;&#x306E;&#x8981;&#x7D20;&#x3060;&#x3051;&#x3092;&#x53D6;&#x5F97;&#x3059;&#x308B;&#x30D5;&#x30A3;&#x30EB;&#x30BF;&#x30FC;&#x30E1;&#x30BD;&#x30C3;&#x30C9;&#x3084;&#x3001;&#x7570;&#x306A;&#x308B;&#x30B3;&#x30EC;&#x30AF;&#x30B7;&#x30E7;&#x30F3;&#x3078;&#x306E;&#x5909;&#x63DB;&#x304C;&#x3067;&#x304D;&#x308B;map&#x30E1;&#x30BD;&#x30C3;&#x30C9;&#x3067;&#x3059;&#x3002;&#x3061;&#x306A;&#x307F;&#x306B;Range&#x3067;&#x6570;&#x5217;&#x3092;&#x7C21;&#x5358;&#x306B;&#x3064;&#x304F;&#x308C;&#x307E;&#x3059;&#x3002;&#x305D;&#x306E;Range&#x3068;map&#x3068;&#x30D1;&#x30BF;&#x30FC;&#x30F3;&#x30DE;&#x30C3;&#x30C1;&#x3092;&#x4F7F;&#x3063;&#x3066;FizzBuzz&#x304C;6&#x884C;&#x3067;&#x66F8;&#x3051;&#x307E;&#x3059;&#x3002;\n \n &#x6B21;&#x306F;trait&#x3067;&#x3059;&#x3002;trait&#x306F;&#x5B9F;&#x88C5;&#x30B3;&#x30FC;&#x30C9;&#x3082;&#x66F8;&#x3051;&#x308B;&#x30A4;&#x30F3;&#x30BF;&#x30FC;&#x30D5;&#x30A7;&#x30A4;&#x30B9;&#x3060;&#x3068;&#x601D;&#x3063;&#x3066;&#x3082;&#x3089;&#x3063;&#x3066;OK&#x3067;&#x3059;&#x3002;\n&#x30AF;&#x30E9;&#x30B9;&#x306B;&#x66F8;&#x304F;&#x3088;&#x3046;&#x306A;&#x5B9F;&#x88C5;&#x30B3;&#x30FC;&#x30C9;&#x306E;&#x65AD;&#x7247;&#x3092;&#x5B9A;&#x7FA9;&#x3057;&#x3066;&#x3001;&#x4ED6;&#x306E;trait&#x3084;class&#x306B;mix-in&#x3067;&#x304D;&#x307E;&#x3059;&#x3002;\n \n \n &#x305D;&#x308C;&#x305E;&#x308C;&#x306E;&#x30C9;&#x30E1;&#x30A4;&#x30F3;&#x30E2;&#x30C7;&#x30EB;&#x3092;&#x8AAC;&#x660E;&#x3059;&#x308B;&#x305F;&#x3081;&#x306B;&#x62BD;&#x8C61;&#x7684;&#x306A;&#x578B;&#x3092;trait&#x3092;&#x4F7F;&#x3063;&#x3066;&#x8AAC;&#x660E;&#x3057;&#x305F;&#x3044;&#x3068;&#x601D;&#x3044;&#x307E;&#x3059;&#x3002;\n&#x307E;&#x305A;&#x6700;&#x521D;&#x306F; DDD&#x306E;&#x30E2;&#x30C7;&#x30EB;&#x99C6;&#x52D5;&#x958B;&#x767A;&#x306E;&#x8A71;&#x306E;&#x6700;&#x521D;&#x306B;&#x51FA;&#x3066;&#x304F;&#x308B;&#x306E;&#x304C;&#x3001;&#x30A8;&#x30F3;&#x30C6;&#x30A3;&#x30C6;&#x30A3;&#x3067;&#x3059;&#x3002;&#x305D;&#x306E;&#x30A8;&#x30F3;&#x30C6;&#x30A3;&#x30C6;&#x30A3;&#x3092;&#x8868;&#x3059;trait&#x3067;&#x3059;&#x3002;\ntrait&#x306F;&#x7C21;&#x5358;&#x306B;&#x8A00;&#x3048;&#x3070;&#x5B9F;&#x88C5;&#x3082;&#x66F8;&#x3051;&#x308B;&#x30A4;&#x30F3;&#x30BF;&#x30FC;&#x30D5;&#x30A7;&#x30A4;&#x30B9;&#x3067;&#x3059;&#x3002;equals&#x3068;hashCode&#x306E;&#x5B9F;&#x88C5;&#x304C;&#x8A18;&#x8FF0;&#x3055;&#x308C;&#x3066;&#x3044;&#x307E;&#x3059;&#x3002;&#x307E;&#x305F;id&#x3082;&#x5B9A;&#x7FA9;&#x3055;&#x308C;&#x3066;&#x3044;&#x307E;&#x3059;&#x3002;id&#x306F;&#x62BD;&#x8C61;&#x30D5;&#x30A3;&#x30FC;&#x30EB;&#x30C9;&#x3068;&#x3044;&#x3063;&#x3066;&#x5B9F;&#x88C5;&#x30AF;&#x30E9;&#x30B9;&#x3067;&#x5B9A;&#x7FA9;&#x304C;&#x5FC5;&#x8981;&#x3067;&#x3059;&#x3002;\n&#x30A8;&#x30F3;&#x30C6;&#x30A3;&#x30C6;&#x30A3;&#x306F;&#x3001;&#x30B7;&#x30B9;&#x30C6;&#x30E0;&#x4E0A;&#x3067;&#x8B58;&#x5225;&#x3092;&#x76EE;&#x7684;&#x3068;&#x3059;&#x308B;&#x30AA;&#x30D6;&#x30B8;&#x30A7;&#x30AF;&#x30C8;&#x3067;&#x3059;&#x3002;&#x8B58;&#x5225;&#x3068;&#x306F;&#x300C;&#x7269;&#x4E8B;&#x306E;&#x7A2E;&#x985E;&#x3084;&#x6027;&#x8CEA;&#x306A;&#x3069;&#x3092;&#x898B;&#x5206;&#x3051;&#x308B;&#x3053;&#x3068;&#x300D;&#x3067;&#x3059;&#x3002;&#x8A00;&#x3044;&#x63DB;&#x3048;&#x308B;&#x3068;&#x3001;&#x898B;&#x5206;&#x3051;&#x308B;&#x3053;&#x3068;&#x304C;&#x5FC5;&#x8981;&#x306A;&#x30AA;&#x30D6;&#x30B8;&#x30A7;&#x30AF;&#x30C8;&#x304C;&#x30A8;&#x30F3;&#x30C6;&#x30A3;&#x30C6;&#x30A3;&#x3067;&#x3059;&#x3002;&#x30A8;&#x30F3;&#x30C6;&#x30A3;&#x30C6;&#x30A3;&#x306E;&#x540C;&#x4E00;&#x6027;&#x306F;&#x3001;&#x5C5E;&#x6027;&#x3067;&#x306F;&#x306A;&#x304F;&#x8B58;&#x5225;&#x5B50;&#x304C;&#x540C;&#x4E00;&#x304B;&#x306B;&#x3088;&#x3063;&#x3066;&#x5224;&#x5B9A;&#x3055;&#x308C;&#x308B;&#x306E;&#x3067;&#x3001;equals&#x3067;&#x306F;match&#x5F0F;&#x3092;&#x4F7F;&#x3063;&#x3066;id&#x3092;&#x5224;&#x5B9A;&#x3059;&#x308B;&#x5B9F;&#x88C5;&#x306B;&#x306A;&#x3063;&#x3066;&#x3044;&#x307E;&#x3059;&#x3002;&#x3053;&#x308C;&#x3092;&#x5B9F;&#x88C5;&#x30AF;&#x30E9;&#x30B9;&#x306B;&#x7D99;&#x627F;(Mix-in)&#x3059;&#x308C;&#x3070;&#x3088;&#x3044;&#x308F;&#x3051;&#x3067;&#x3059;&#x3002;\n &#x5148;&#x307B;&#x3069;&#x306E;Entity&#x3092;&#x5B9F;&#x88C5;&#x3057;&#x305F;Employee&#x30AF;&#x30E9;&#x30B9;&#x3067;&#x3059;&#x3002;Entity&#x306E;&#x30C8;&#x30EC;&#x30A4;&#x30C8;&#x306E;id&#x30D5;&#x30A3;&#x30FC;&#x30EB;&#x30C9;&#x304C;&#x3042;&#x3063;&#x305F;&#x306E;&#x3067;&#x3001;Employee&#x3067;&#x3082;id&#x5C5E;&#x6027;&#x304C;&#x5FC5;&#x8981;&#x306B;&#x306A;&#x308A;&#x307E;&#x3059;&#x3002;\n&#x30A8;&#x30F3;&#x30C6;&#x30A3;&#x30C6;&#x30A3;&#x306E;&#x6982;&#x5FF5;&#x7684;&#x306A;&#x540C;&#x4E00;&#x6027;&#x306F;&#x3001;id&#x306E;&#x307F;&#x306B;&#x3088;&#x3063;&#x3066;&#x884C;&#x308F;&#x308C;&#x308B;&#x306E;&#x3067;&#x3001;&#x3053;&#x306E;&#x3088;&#x3046;&#x306B;&#x306A;&#x308A;&#x307E;&#x3059;&#x3002;&#x30A8;&#x30F3;&#x30C6;&#x30A3;&#x30C6;&#x30A3;&#x306E;&#x5C5E;&#x6027;&#x306F;&#x5909;&#x5316;&#x3057;&#x3066;&#x3082;&#x3001;&#x8B58;&#x5225;&#x5B50;&#x304C;&#x5909;&#x308F;&#x3089;&#x306A;&#x3051;&#x308C;&#x3070;&#x30A8;&#x30F3;&#x30C6;&#x30A3;&#x30C6;&#x30A3;&#x3092;&#x898B;&#x5206;&#x3051;&#x308B;&#x3053;&#x3068;&#x304C;&#x3067;&#x304D;&#x307E;&#x3059;&#x3002;&#x5F93;&#x696D;&#x54E1;&#x306E;&#x8B58;&#x5225;&#x3092;&#x5C5E;&#x6027;&#x3067;&#x884C;&#x3063;&#x3066;&#x3044;&#x308B;&#x3068;&#x3001;&#x8EAB;&#x9577;&#x3084;&#x4F53;&#x91CD;&#x3084;&#x540D;&#x524D;&#x306A;&#x3069;&#x304C;&#x5909;&#x308F;&#x3063;&#x305F;&#x5834;&#x5408;&#x306B;&#x8B58;&#x5225;&#x3067;&#x304D;&#x306A;&#x304F;&#x306A;&#x3063;&#x3066;&#x3057;&#x307E;&#x3044;&#x307E;&#x3059;&#x3002;&#x305D;&#x3046;&#x3044;&#x3046;&#x3053;&#x3068;&#x3092;&#x56DE;&#x907F;&#x3059;&#x308B;&#x305F;&#x3081;&#x306B;&#x30A8;&#x30F3;&#x30C6;&#x30A3;&#x30C6;&#x30A3;&#x3092;&#x4F7F;&#x3044;&#x307E;&#x3059;&#x3002;\n\n\n &#x540C;&#x6642;&#x306B;&#x30D5;&#x30A1;&#x30AF;&#x30C8;&#x30EA;&#x3082;&#x8AAC;&#x660E;&#x3057;&#x307E;&#x3059;&#x304C;&#x3001;&#x8907;&#x96D1;&#x306B;&#x306A;&#x308A;&#x304C;&#x3061;&#x306A;&#x30AA;&#x30D6;&#x30B8;&#x30A7;&#x30AF;&#x30C8;&#x306E;&#x751F;&#x6210;&#x51E6;&#x7406;&#x3092;&#x62C5;&#x3046;&#x30AA;&#x30D6;&#x30B8;&#x30A7;&#x30AF;&#x30C8;&#x3067;&#x3059;&#x3002;\n&#x4F8B;&#x3048;&#x3070;&#x3001;&#x8ECA;&#x3068;&#x3044;&#x3046;&#x30AA;&#x30D6;&#x30B8;&#x30A7;&#x30AF;&#x30C8;&#x3067;&#x8ECA;&#x81EA;&#x8EAB;&#x3092;&#x4F5C;&#x308B;&#x3053;&#x3068;&#x306F;&#x3067;&#x304D;&#x306A;&#x3044;&#x3002;&#x3084;&#x306F;&#x308A;&#x3001;&#x81EA;&#x52D5;&#x8ECA;&#x5DE5;&#x5834;&#x304C;&#x8ECA;&#x3092;&#x751F;&#x7523;&#x3059;&#x308B;&#x3068;&#x3044;&#x3046;&#x306E;&#x304C;&#x81EA;&#x7136;&#x3060;&#x3057;&#x3001;&#x8ECA;&#x306E;&#x8CFC;&#x5165;&#x8005;&#x306F;&#x5DE5;&#x5834;&#x5185;&#x306E;&#x8907;&#x96D1;&#x306A;&#x751F;&#x7523;&#x5DE5;&#x7A0B;&#x3092;&#x6C17;&#x306B;&#x3059;&#x308B;&#x5FC5;&#x8981;&#x306F;&#x306A;&#x3044;&#x3002;&#x3053;&#x306E;&#x3088;&#x3046;&#x306B;&#x672C;&#x6765;&#x306E;&#x5F79;&#x5272;&#x3067;&#x306A;&#x3044;&#x8907;&#x96D1;&#x306A;&#x751F;&#x6210;&#x51E6;&#x7406;&#x3092;&#x30D5;&#x30A1;&#x30AF;&#x30C8;&#x30EA;&#x306B;&#x4EFB;&#x305B;&#x308B;&#x3053;&#x3068;&#x3067;&#x3001;&#x30A8;&#x30F3;&#x30C6;&#x30A3;&#x30C6;&#x30A3;&#x3084;&#x30D0;&#x30EA;&#x30E5;&#x30FC;&#x30AA;&#x30D6;&#x30B8;&#x30A7;&#x30AF;&#x30C8;&#x3092;&#x6271;&#x3044;&#x3084;&#x3059;&#x304F;&#x3067;&#x304D;&#x307E;&#x3059;&#x3002;\nScala&#x306E;&#x30B3;&#x30F3;&#x30D1;&#x30CB;&#x30AA;&#x30F3;&#x30AA;&#x30D6;&#x30B8;&#x30A7;&#x30AF;&#x30C8;&#x306F;&#x307E;&#x3055;&#x306B;&#x30D5;&#x30A1;&#x30AF;&#x30C8;&#x30EA;&#x8CAC;&#x52D9;&#x3092;&#x30AF;&#x30E9;&#x30B9;&#x304B;&#x3089;&#x5206;&#x96E2;&#x3059;&#x308B;&#x306E;&#x306B;&#x3061;&#x3087;&#x3046;&#x3069;&#x3044;&#x3044;&#x5834;&#x6240;&#x3067;&#x3059;&#x3002;&#x30B3;&#x30F3;&#x30D1;&#x30CB;&#x30AA;&#x30F3;&#x30AA;&#x30D6;&#x30B8;&#x30A7;&#x30AF;&#x30C8;&#x306E;apply&#x30E1;&#x30BD;&#x30C3;&#x30C9;&#x306B;&#x30D5;&#x30A1;&#x30AF;&#x30C8;&#x30EA;&#x3092;&#x5B9F;&#x88C5;&#x3057;&#x3066;&#x304F;&#x3060;&#x3055;&#x3044;&#x3002;\n &#x30D5;&#x30A1;&#x30AF;&#x30C8;&#x30EA;&#x3092;&#x547C;&#x3073;&#x51FA;&#x3059;&#x3060;&#x3051;&#x3067;&#x3059;&#x3002;\n &#x6B21;&#x306F;&#x3001;&#x5024;&#x30AA;&#x30D6;&#x30B8;&#x30A7;&#x30AF;&#x30C8;&#x3068;&#x305D;&#x306E;&#x30D5;&#x30A1;&#x30AF;&#x30C8;&#x30EA;&#x3067;&#x3059;&#x3002;\n&#x59CB;&#x3081;&#x306B;&#x7D39;&#x4ECB;&#x3057;&#x305F;Money&#x30AF;&#x30E9;&#x30B9;&#x3067;&#x3059;&#x3002;Money&#x30AF;&#x30E9;&#x30B9;&#x306F;&#x30D0;&#x30EA;&#x30E5;&#x30FC;&#x30AA;&#x30D6;&#x30B8;&#x30A7;&#x30AF;&#x30C8;&#x3002;&#x3064;&#x307E;&#x308A;&#x5024;&#x3092;&#x8868;&#x3059;&#x30AA;&#x30D6;&#x30B8;&#x30A7;&#x30AF;&#x30C8;&#x3067;&#x3059;&#x3002;&#x30A8;&#x30F3;&#x30C6;&#x30A3;&#x30C6;&#x30A3;&#x306E;&#x3088;&#x3046;&#x306B;&#x6982;&#x5FF5;&#x7684;&#x306A;&#x540C;&#x4E00;&#x6027;&#x3092;&#x6301;&#x3061;&#x307E;&#x305B;&#x3093;&#x3002;&#x7269;&#x4E8B;&#x3092;&#x8868;&#x3059;&#x30AA;&#x30D6;&#x30B8;&#x30A7;&#x30AF;&#x30C8;&#x3067;&#x3059;&#x3002;\n&#x4F8B;&#x3048;&#x3070;&#x3001;100&#x5186;&#x304C;&#x305D;&#x308C;&#x305E;&#x308C;&#x306B;&#x3042;&#x3063;&#x3066;&#x3082;&#x3001;100&#x5186;&#x3068;&#x3044;&#x3046;&#x4FA1;&#x5024;&#x3092;&#x8868;&#x3057;&#x3066;&#x3044;&#x308C;&#x3070;&#x3088;&#x3044;&#x306E;&#x3067;&#x3042;&#x3063;&#x3066;&#x3001;&#x500B;&#x3005;&#x306E;100&#x5186;&#x306E;&#x8B58;&#x5225;&#x306B;&#x95A2;&#x5FC3;&#x304C;&#x3042;&#x308B;&#x308F;&#x3051;&#x3067;&#x306F;&#x3042;&#x308A;&#x307E;&#x305B;&#x3093;&#x3002;&#x4F55;&#x3067;&#x3042;&#x308B;&#x304B;&#x3060;&#x3051;&#x304C;&#x554F;&#x984C;&#x3067;&#x3001;&#x8AB0;&#x3068;&#x304B;&#x3001;&#x3069;&#x308C;&#x3067;&#x3042;&#x308B;&#x304B;&#x306F;&#x554F;&#x308F;&#x308C;&#x306A;&#x3044;&#x8A2D;&#x8A08;&#x306E;&#x8981;&#x7D20;&#x3067;&#x3059;&#x3002;\n&#x5024;&#x30AA;&#x30D6;&#x30B8;&#x30A7;&#x30AF;&#x30C8;&#x306F;&#x69D8;&#x3005;&#x306A;&#x30AA;&#x30D6;&#x30B8;&#x30A7;&#x30AF;&#x30C8;&#x3067;&#x5171;&#x6709;&#x3055;&#x308C;&#x308B;&#x305F;&#x3081;&#x3001;&#x4E0D;&#x5909;&#x3067;&#x3042;&#x308B;&#x5FC5;&#x8981;&#x304C;&#x3042;&#x308A;&#x307E;&#x3059;&#x3002;&#x305D;&#x306E;&#x305F;&#x3081;&#x30D5;&#x30A3;&#x30FC;&#x30EB;&#x30C9;&#x306F;val&#x3067;&#x5BA3;&#x8A00;&#x3057;&#x3066;&#x3044;&#x307E;&#x3059;&#x3002;&#x5171;&#x6709;&#x3059;&#x308B;&#x306A;&#x3089;&#x4E0D;&#x5909;&#x3002;&#x6027;&#x80FD;&#x9762;&#x3092;&#x8003;&#x616E;&#x3057;&#x3066;&#x53EF;&#x5909;&#x3068;&#x3059;&#x308B;&#x5834;&#x5408;&#x3082;&#x3042;&#x308B;&#x304C;&#x3001;&#x539F;&#x5247;&#x7684;&#x306B;&#x4E0D;&#x5909;&#x3067;&#x3059;&#x3002;\n&#x307E;&#x305F;&#x3001;equals&#x30E1;&#x30BD;&#x30C3;&#x30C9;&#x3067;&#x306F;&#x3001;&#x4E00;&#x822C;&#x7684;&#x306B;ID&#x3088;&#x308A;&#x7B49;&#x4FA1;&#x5224;&#x5B9A;&#x3067;&#x306F;&#x306A;&#x304F;&#x3001;&#x5C5E;&#x6027;&#x304C;&#x540C;&#x3058;&#x304B;&#x3069;&#x3046;&#x304B;&#x306E;&#x5224;&#x5B9A;&#x3092;&#x884C;&#x3044;&#x307E;&#x3059;&#x3002;&#x30A8;&#x30F3;&#x30C6;&#x30A3;&#x30C6;&#x30A3;&#x3068;&#x540C;&#x69D8;&#x306B;&#x30D5;&#x30A1;&#x30AF;&#x30C8;&#x30EA;&#x306F;&#x30B3;&#x30F3;&#x30D1;&#x30CB;&#x30AA;&#x30F3;&#x30AA;&#x30D6;&#x30B8;&#x30A7;&#x30AF;&#x30C8;&#x3067;&#x5B9F;&#x88C5;&#x3057;&#x307E;&#x3059;&#x3002;unapply&#x30E1;&#x30BD;&#x30C3;&#x30C9;&#x306F;&#x62BD;&#x51FA;&#x5B50;&#x30E1;&#x30BD;&#x30C3;&#x30C9;&#x3067;&#x3059;&#x3002;&#x3053;&#x308C;&#x306F;&#x5F8C;&#x3067;&#x8AAC;&#x660E;&#x3057;&#x307E;&#x3059;&#x3002;\n\n &#x5024;&#x30AA;&#x30D6;&#x30B8;&#x30A7;&#x30AF;&#x30C8;&#x306E;&#x7B49;&#x4FA1;&#x5224;&#x5B9A;&#x306E;&#x4F8B;&#x3067;&#x3059;&#x3002;&#x3053;&#x308C;&#x306F;DDD&#x306B;&#x9650;&#x3089;&#x305A;&#x4E00;&#x822C;&#x5951;&#x7D04;&#x306B;&#x57FA;&#x3065;&#x304D;&#x5B9F;&#x88C5;&#x3055;&#x308C;&#x307E;&#x3059;&#x3002;\nunapply&#x3068;&#x3044;&#x3046;&#x62BD;&#x51FA;&#x5B50;&#x30E1;&#x30BD;&#x30C3;&#x30C9;&#x306F;&#x3001;apply&#x30E1;&#x30BD;&#x30C3;&#x30C9;&#x306E;&#x9006;&#x306E;&#x3053;&#x3068;&#x3092;&#x884C;&#x3046;&#x30E1;&#x30BD;&#x30C3;&#x30C9;&#x3067;&#x3001;&#x30AA;&#x30D6;&#x30B8;&#x30A7;&#x30AF;&#x30C8;&#x306E;&#x30D5;&#x30A3;&#x30FC;&#x30EB;&#x30C9;&#x3092;&#x62BD;&#x51FA;&#x3059;&#x308B;&#x3053;&#x3068;&#x304C;&#x3067;&#x304D;&#x307E;&#x3059;&#x3002;&#x30AF;&#x30E9;&#x30B9;&#x69CB;&#x9020;&#x306B;&#x4F9D;&#x5B58;&#x305B;&#x305A;&#x306B;&#x30AF;&#x30E9;&#x30B9;&#x306E;&#x60C5;&#x5831;&#x306B;&#x30A2;&#x30AF;&#x30BB;&#x30B9;&#x3059;&#x308B;&#x3053;&#x3068;&#x304C;&#x3067;&#x304D;&#x307E;&#x3059;&#x3002;&#x307E;&#x305F;&#x3001;match&#x5F0F;&#x3068;&#x7D44;&#x307F;&#x5408;&#x308F;&#x305B;&#x308B;&#x3068;&#x30D1;&#x30BF;&#x30FC;&#x30F3;&#x30DE;&#x30C3;&#x30C1;&#x306B;&#x5229;&#x7528;&#x3067;&#x304D;&#x307E;&#x3059;&#x3002;&#x30A8;&#x30F3;&#x30C6;&#x30A3;&#x30C6;&#x30A3;&#x306B;&#x3082;&#x5B9A;&#x7FA9;&#x3059;&#x308B;&#x3053;&#x3068;&#x304C;&#x3067;&#x304D;&#x307E;&#x3059;&#x3002;\n Scala&#x306B;&#x306F;&#x30D0;&#x30EA;&#x30E5;&#x30FC;&#x30AA;&#x30D6;&#x30B8;&#x30A7;&#x30AF;&#x30C8;&#x3092;&#x7C21;&#x5358;&#x306B;&#x4F5C;&#x308B;&#x305F;&#x3081;&#x306E;&#x6A5F;&#x80FD;&#x304C;&#x3042;&#x308A;&#x307E;&#x3059;&#x3002;case class&#x3067;&#x3059;&#x3002;\n&#x3053;&#x306E;&#x3088;&#x3046;&#x306B;&#x5BA3;&#x8A00;&#x3059;&#x308B;&#x3068;&#x524D;&#x4F8B;&#x3068;&#x540C;&#x3058;&#x3082;&#x306E;&#x304C;&#x30B3;&#x30F3;&#x30D1;&#x30A4;&#x30E9;&#x306B;&#x3088;&#x3063;&#x3066;&#x5B9A;&#x7FA9;&#x3055;&#x308C;&#x307E;&#x3059;&#x3002;&#x5358;&#x7D14;&#x306A;&#x5024;&#x30AA;&#x30D6;&#x30B8;&#x30A7;&#x30AF;&#x30C8;&#x306A;&#x3089;&#x3053;&#x308C;&#x3067;&#x5341;&#x5206;&#x3060;&#x3068;&#x601D;&#x3044;&#x307E;&#x3059;&#x3002;\n&#x307E;&#x305F;&#x3001;&#x7279;&#x306B;&#x5024;&#x30AA;&#x30D6;&#x30B8;&#x30A7;&#x30AF;&#x30C8;&#x3068;&#x3057;&#x3066;&#x306E;&#x578B;&#x3092;&#x30C8;&#x30EC;&#x30A4;&#x30C8;&#x3067;&#x5B9A;&#x7FA9;&#x3057;&#x3066;&#x3044;&#x307E;&#x305B;&#x3093;&#x304C;&#x3001;&#x5FC5;&#x8981;&#x306A;&#x3089;&#x30DE;&#x30FC;&#x30AB;&#x30FC;&#x30C8;&#x30EC;&#x30A4;&#x30C8;&#x3092;&#x5B9A;&#x7FA9;&#x3059;&#x308B;&#x3068;&#x3088;&#x3044;&#x304B;&#x3082;&#x3057;&#x308C;&#x307E;&#x305B;&#x3093;&#x3002;\n\n &#x5024;&#x30AA;&#x30D6;&#x30B8;&#x30A7;&#x30AF;&#x30C8;&#x306F;&#x4E0D;&#x5909;&#x306A;&#x306E;&#x3067;&#x3001;&#x5B8C;&#x5168;&#x306B;&#x30A4;&#x30F3;&#x30B9;&#x30BF;&#x30F3;&#x30B9;&#x3092;&#x7F6E;&#x304D;&#x63DB;&#x3048;&#x308B;&#x4EE5;&#x5916;&#x306B;&#x5909;&#x66F4;&#x306E;&#x624B;&#x6BB5;&#x304C;&#x3042;&#x308A;&#x307E;&#x305B;&#x3093;&#x3002;&#x5024;&#x30AA;&#x30D6;&#x30B8;&#x30A7;&#x30AF;&#x30C8;&#x306E;&#x552F;&#x4E00;&#x306E;&#x30C7;&#x30E1;&#x30EA;&#x30C3;&#x30C8;&#x3068;&#x3082;&#x547C;&#x3070;&#x308C;&#x3066;&#x3044;&#x307E;&#x3059;&#x304C;&#x3001;&#x983B;&#x7E41;&#x306B;&#x66F4;&#x65B0;&#x304C;&#x3042;&#x308B;&#x3088;&#x3046;&#x306A;&#x5834;&#x5408;&#x306F;&#x30D3;&#x30EB;&#x30C0;&#x30FC;&#x304C;&#x6B32;&#x3057;&#x304F;&#x306A;&#x308B;&#x304B;&#x3082;&#x3057;&#x308C;&#x307E;&#x305B;&#x3093;&#x3002;&#x5B9F;&#x88C5;&#x65B9;&#x6CD5;&#x306F;&#x79C1;&#x306E;&#x30D6;&#x30ED;&#x30B0;&#x306E;&#x65B9;&#x306B;&#x3042;&#x308B;&#x306E;&#x3067;ValueObjectBuilder&#x3067;&#x691C;&#x7D22;&#x3057;&#x3066;&#x307F;&#x3066;&#x304F;&#x3060;&#x3055;&#x3044;&#x3002;\n &#x6B21;&#x306F;&#x30B5;&#x30FC;&#x30D3;&#x30B9;&#x3067;&#x3059;&#x306D;&#x3002;\n&#x30A8;&#x30F3;&#x30C6;&#x30A3;&#x30C6;&#x30A3;&#x3084;&#x30D0;&#x30EA;&#x30E5;&#x30FC;&#x30AA;&#x30D6;&#x30B8;&#x30A7;&#x30AF;&#x30C8;&#x306F;&#x500B;&#x5225;&#x306B;&#x632F;&#x308B;&#x821E;&#x3044;&#x3092;&#x6301;&#x3064;&#x5834;&#x5408;&#x304C;&#x3042;&#x308B;&#x3002;\n&#x3057;&#x304B;&#x3057;&#x3001;&#x3059;&#x3079;&#x3066;&#x306E;&#x632F;&#x308B;&#x821E;&#x3044;&#x304C;&#x30A8;&#x30F3;&#x30C6;&#x30A3;&#x30C6;&#x30A3;&#x3084;&#x30D0;&#x30EA;&#x30E5;&#x30FC;&#x30AA;&#x30D6;&#x30B8;&#x30A7;&#x30AF;&#x30C8;&#x306B;&#x5C5E;&#x3059;&#x308B;&#x3068;&#x306F;&#x9650;&#x3089;&#x306A;&#x3044;&#x3002;&#x9006;&#x306B;&#x5C5E;&#x3059;&#x308B;&#x3068;&#x4E0D;&#x81EA;&#x7136;&#x306A;&#x632F;&#x308B;&#x821E;&#x3044;&#x3082;&#x3042;&#x308B;&#x3002;&#x305D;&#x306E;&#x3088;&#x3046;&#x306A;&#x5834;&#x5408;&#x306B;&#x30B5;&#x30FC;&#x30D3;&#x30B9;&#x3092;&#x4F7F;&#x3046;&#x3002;\n&#x3053;&#x306E;&#x4F8B;&#x306F;&#x53E3;&#x5EA7;&#x9593;&#x306E;&#x9001;&#x91D1;&#x3092;&#x8868;&#x3057;&#x305F;&#x30B5;&#x30FC;&#x30D3;&#x30B9;&#x3067;&#x3059;&#x3002;&#x30B5;&#x30FC;&#x30D3;&#x30B9;&#x3067;&#x306F;&#x539F;&#x5247;&#x7684;&#x306B;&#x72B6;&#x614B;&#x3092;&#x6301;&#x305F;&#x305A;&#x306B;&#x3001;&#x30C9;&#x30E1;&#x30A4;&#x30F3;&#x30AA;&#x30D6;&#x30B8;&#x30A7;&#x30AF;&#x30C8;&#x3092;&#x4F7F;&#x3063;&#x305F;&#x30B9;&#x30AF;&#x30EA;&#x30D7;&#x30C8;&#x306E;&#x3088;&#x3046;&#x306B;&#x632F;&#x821E;&#x3046;&#x3002;&#x591A;&#x304F;&#x306E;&#x5834;&#x5408;&#x306F;object&#x3067;&#x5B9F;&#x88C5;&#x3059;&#x308C;&#x3070;&#x3088;&#x3044;&#x3068;&#x601D;&#x3044;&#x307E;&#x3059;&#x3002;\n\n &#x6B21;&#x306F;&#x30A2;&#x30B0;&#x30EA;&#x30B2;&#x30FC;&#x30C8;&#x3002;&#x30A2;&#x30B0;&#x30EA;&#x30B2;&#x30FC;&#x30C8;&#x306F;&#x96E3;&#x3057;&#x3044;&#x3067;&#x3059;&#x306D;&#x3002;\n&#x30EB;&#x30FC;&#x30C8;&#x30A8;&#x30F3;&#x30C6;&#x30A3;&#x30C6;&#x30A3;&#x306F;&#x3001;&#x4E0D;&#x5909;&#x6761;&#x4EF6;&#x306E;&#x30C1;&#x30A7;&#x30C3;&#x30AF;&#x3092;&#x884C;&#x3044;&#x3001;&#x30B0;&#x30ED;&#x30FC;&#x30D0;&#x30EB;&#x306A;&#x540C;&#x4E00;&#x6027;&#x3092;&#x6301;&#x3064;&#x3002;&#x30ED;&#x30FC;&#x30AB;&#x30EB;&#x30A8;&#x30F3;&#x30C6;&#x30A3;&#x30C6;&#x30A3;&#x306F;&#x96C6;&#x7D04;&#x5185;&#x3067;&#x306E;&#x540C;&#x4E00;&#x6027;&#x3092;&#x4FDD;&#x8A3C;&#x3002;\n&#x5916;&#x90E8;&#x306E;&#x30AA;&#x30D6;&#x30B8;&#x30A7;&#x30AF;&#x30C8;&#x306F;&#x3001;&#x5883;&#x754C;&#x5185;&#x90E8;&#x306E;&#x30AA;&#x30D6;&#x30B8;&#x30A7;&#x30AF;&#x30C8;&#x306E;&#x53C2;&#x7167;&#x3092;&#x4FDD;&#x6301;&#x3067;&#x304D;&#x306A;&#x3044;&#x3002;&#x30ED;&#x30FC;&#x30AB;&#x30EB;&#x30A8;&#x30F3;&#x30C6;&#x30A3;&#x30C6;&#x30A3;&#x3092;&#x4ED6;&#x306E;&#x30AA;&#x30D6;&#x30B8;&#x30A7;&#x30AF;&#x30C8;&#x306B;&#x6E21;&#x305B;&#x308B;&#x304C;&#x4E00;&#x6642;&#x7684;&#x306A;&#x53C2;&#x7167;&#x3002;&#x5024;&#x30AA;&#x30D6;&#x30B8;&#x30A7;&#x30AF;&#x30C8;&#x306F;&#x4E0D;&#x5909;&#x3067;&#x3042;&#x308C;&#x3070;&#x53C2;&#x7167;&#x3092;&#x6E21;&#x305B;&#x308B;&#x3001;&#x53EF;&#x5909;&#x306A;&#x3089;&#x30B3;&#x30D4;&#x30FC;&#x304C;&#x5FC5;&#x8981;&#x3002;\n&#x30EA;&#x30DD;&#x30B8;&#x30C8;&#x30EA;&#x306A;&#x3069;&#x304B;&#x3089;&#x306E;&#x5165;&#x51FA;&#x529B;&#x306F;&#x3001;&#x96C6;&#x7D04;&#x30EB;&#x30FC;&#x30C8;&#x306E;&#x5358;&#x4F4D;&#x3068;&#x306A;&#x308B;&#x3002;&#x3064;&#x307E;&#x308A;&#x3001;&#x30C8;&#x30E9;&#x30F3;&#x30B6;&#x30AF;&#x30B7;&#x30E7;&#x30F3;&#x5883;&#x754C;&#x3002;\n &#x3059;&#x3079;&#x3066;&#x306E;&#x5909;&#x66F4;&#x306F;Employee&#x3092;&#x901A;&#x3059;&#x5FC5;&#x8981;&#x304C;&#x3042;&#x308B;&#x304C;&#x3001;&#x5909;&#x66F4;&#x3067;&#x304D;&#x3066;&#x3057;&#x307E;&#x3046;&#x3002;(1)&#x3067;&#x306F;&#x5916;&#x90E8;&#x306E;Department&#x306E;&#x53C2;&#x7167;&#x3092;&#x6301;&#x3063;&#x3066;&#x3044;&#x308B;&#x305F;&#x3081;&#x3067;&#x3001;(2)&#x3067;&#x306F;&#x5185;&#x90E8;&#x306E;Department&#x306E;&#x53C2;&#x7167;&#x3092;&#x516C;&#x958B;&#x3057;&#x3066;&#x3044;&#x308B;&#x306E;&#x3067;&#x3001; &#x4E0D;&#x5909;&#x6761;&#x4EF6;&#x304C;&#x7DAD;&#x6301;&#x3067;&#x304D;&#x3066;&#x3044;&#x306A;&#x3044;&#x3002;\n &#x305D;&#x3053;&#x3067;&#x4E00;&#x3064;&#x306E;&#x89E3;&#x6C7A;&#x7B56;&#x3068;&#x3057;&#x3066;&#x306F;&#x3001;Java&#x3067;&#x306F;Cloneable(&#x30AF;&#x30ED;&#x30FC;&#x30CA;&#x30D6;&#x30EB;)&#x3092;&#x5B9F;&#x88C5;&#x3057;&#x3066;&#x9632;&#x5FA1;&#x7684;&#x30B3;&#x30D4;&#x30FC;&#x3092;&#x751F;&#x6210;&#x3059;&#x308B;&#x3053;&#x3068;&#x3067;&#x3001;&#x4E0D;&#x5909;&#x6761;&#x4EF6;&#x3092;&#x7DAD;&#x6301;&#x3059;&#x308B;&#x3068;&#x3044;&#x3046;&#x65B9;&#x6CD5;&#x304C;&#x3042;&#x308A;&#x307E;&#x3059;&#x3002;Scala&#x3067;&#x306F;@cloneable&#x3092;&#x30AF;&#x30E9;&#x30B9;&#x306B;&#x4FEE;&#x98FE;&#x3059;&#x308C;&#x3070;&#x3001;clone&#x30E1;&#x30BD;&#x30C3;&#x30C9;&#x3092;&#x5B9F;&#x88C5;&#x3067;&#x304D;&#x308B;&#x3088;&#x3046;&#x306B;&#x306A;&#x308A;&#x307E;&#x3059;&#x3002;\n(1)&#x30B3;&#x30F3;&#x30B9;&#x30C8;&#x30E9;&#x30AF;&#x30BF;&#x304B;&#x3089;&#x5916;&#x90E8;&#x306E;dept&#x3092;&#x53D7;&#x3051;&#x53D6;&#x3063;&#x305F;&#x3089;&#x3001;clone&#x3067;&#x8907;&#x88FD;&#x3092;&#x4F5C;&#x308A;&#x307E;&#x3059;&#x3002;\n(2)&#x5916;&#x90E8;&#x3078;dept&#x3092;&#x8FD4;&#x3059;&#x5834;&#x5408;&#x3082;clone&#x3067;&#x8907;&#x88FD;&#x3092;&#x8FD4;&#x3057;&#x307E;&#x3059;&#x3002;\n(3)&#x5916;&#x90E8;&#x304B;&#x3089;dept&#x3092;&#x53D6;&#x308A;&#x8FBC;&#x3080;&#x5834;&#x5408;&#x3082;clone&#x3067;&#x8907;&#x88FD;&#x3092;&#x4F5C;&#x3063;&#x3066;&#x53D6;&#x308A;&#x8FBC;&#x307F;&#x307E;&#x3059;&#x3002;\n&#x3053;&#x3046;&#x3059;&#x308B;&#x3053;&#x3068;&#x3067;Employee&#x304C;&#x96C6;&#x7D04;&#x3068;&#x3057;&#x3066;&#x306E;&#x4E0D;&#x5909;&#x6761;&#x4EF6;&#x3092;&#x7DAD;&#x6301;&#x3067;&#x304D;&#x307E;&#x3059;&#x3002;\n&#x307E;&#x305F;&#x3001;Employe&#x81EA;&#x8EAB;&#x3082;&#x53EF;&#x5909;&#x30AA;&#x30D6;&#x30B8;&#x30A7;&#x30AF;&#x30C8;&#x306A;&#x3069;&#x3067;clone&#x3092;&#x63D0;&#x4F9B;&#x3057;&#x307E;&#x3059;&#x3002;&#x305D;&#x306E;&#x5834;&#x5408;&#x306F;dept&#x3092;&#x30C7;&#x30A3;&#x30FC;&#x30D7;&#x30B3;&#x30D4;&#x30FC;&#x3059;&#x308B;&#x3088;&#x3046;&#x306B;&#x3057;&#x306A;&#x3051;&#x308C;&#x3070;&#x306A;&#x308A;&#x307E;&#x305B;&#x3093;&#x3002;(4)\n &#x578B;&#x3068;&#x3057;&#x3066;&#x5229;&#x7528;&#x3057;&#x3084;&#x3059;&#x3044;&#x3088;&#x3046;&#x306B;&#x3059;&#x308B;&#x306B;&#x306F;&#x3001;&#x3053;&#x306E;&#x3088;&#x3046;&#x306A;&#x30C8;&#x30EC;&#x30A4;&#x30C8;&#x3092;&#x5B9A;&#x7FA9;&#x3059;&#x308B;&#x3068;&#x3088;&#x3044;&#x3067;&#x3059;&#x3002;Cloneable&#x3092;&#x30A8;&#x30F3;&#x30C6;&#x30A3;&#x30C6;&#x30A3;&#x306B;&#x30DF;&#x30C3;&#x30AF;&#x30B9;&#x30A4;&#x30F3;&#x3059;&#x308B;&#x305F;&#x3081;&#x306E;&#x30C8;&#x30EC;&#x30A4;&#x30C8;&#x3067;&#x3059;&#x3002;\n \n Cloneable&#x4EE5;&#x5916;&#x306B;&#x306F;&#x30D5;&#x30A1;&#x30AF;&#x30C8;&#x30EA;&#x3067;&#x8907;&#x88FD;&#x3092;&#x4F5C;&#x308B;&#x65B9;&#x6CD5;&#x3082;&#x3042;&#x308A;&#x307E;&#x3059;&#x3002;&#x3053;&#x3061;&#x3089;&#x306E;&#x307B;&#x3046;&#x304C;&#x69CB;&#x9020;&#x304C;&#x30B7;&#x30F3;&#x30D7;&#x30EB;&#x3067;&#x3059;&#x304C;&#x3001;&#x5177;&#x8C61;&#x30AF;&#x30E9;&#x30B9;&#x304C;&#x3042;&#x308B;&#x3068;&#x3053;&#x308D;&#x3067;&#x3057;&#x304B;&#x8907;&#x88FD;&#x304C;&#x4F5C;&#x308C;&#x307E;&#x305B;&#x3093;&#x3002;&#x5177;&#x8C61;&#x30AF;&#x30E9;&#x30B9;&#x306B;&#x4F9D;&#x5B58;&#x3067;&#x304D;&#x306A;&#x3044;&#x5834;&#x5408;&#x306F;clone&#x306E;&#x65B9;&#x304C;&#x6709;&#x5229;&#x3067;&#x3057;&#x3087;&#x3046;&#x3002;\n &#x30EA;&#x30DD;&#x30B8;&#x30C8;&#x30EA;&#x306F;&#x3001;&#x30AA;&#x30D6;&#x30B8;&#x30A7;&#x30AF;&#x30C8;&#x306E;&#x8CAF;&#x8535;&#x5EAB;&#x3068;&#x3044;&#x3046;&#x610F;&#x5473;&#x3002;\n&#x30A8;&#x30F3;&#x30C6;&#x30A3;&#x30C6;&#x30A3;&#x306F;&#x751F;&#x6210;&#x3055;&#x308C;&#x305F;&#x5F8C;&#x306B;&#x7834;&#x68C4;&#x3055;&#x308C;&#x308B;&#x307E;&#x3067;&#x306E;&#x9593;&#x3001;&#x30C7;&#x30FC;&#x30BF;&#x30D9;&#x30FC;&#x30B9;&#x3084;&#x30D5;&#x30A1;&#x30A4;&#x30EB;&#x3001;&#x30E1;&#x30E2;&#x30EA;&#x30FC;&#x306A;&#x3069;&#x306B;&#x4E00;&#x6642;&#x7684;&#x306B;&#x6C38;&#x7D9A;&#x5316;&#x3059;&#x308B;&#x3053;&#x3068;&#x304C;&#x591A;&#x3044;&#x3002;&#x3057;&#x304B;&#x3057;&#x3001;&#x6C38;&#x7D9A;&#x5316;&#x306F;&#x8907;&#x96D1;&#x306A;&#x3082;&#x306E;&#x3067;&#x3042;&#x308A;&#x3001;&#x30C9;&#x30E1;&#x30A4;&#x30F3;&#x306E;&#x672C;&#x8CEA;&#x3067;&#x3082;&#x306A;&#x3044;&#x3002;&#x305D;&#x306E;&#x6C38;&#x7D9A;&#x5316;&#x3092;&#x30EA;&#x30DD;&#x30B8;&#x30C8;&#x30EA;&#x304C;&#x62C5;&#x3046;&#x3053;&#x3068;&#x3067;&#x3001;&#x3053;&#x306E;&#x3088;&#x3046;&#x306A;&#x672C;&#x8CEA;&#x7684;&#x3067;&#x306F;&#x306A;&#x3044;&#x8907;&#x96D1;&#x3055;&#x3092;&#x6392;&#x9664;&#x3059;&#x308B;&#x3002;\n&#x3053;&#x3053;&#x3067;&#x306F;&#x307E;&#x305A;&#x30EA;&#x30FC;&#x30C9;&#x30AA;&#x30F3;&#x30EA;&#x30FC;&#x306A;&#x30EA;&#x30DD;&#x30B8;&#x30C8;&#x30EA;&#x3068;&#x3057;&#x3066;&#x3001;EntityResolver&#x3068;&#x3044;&#x3046;&#x306E;&#x3092;&#x5B9A;&#x7FA9;&#x3057;&#x3066;&#x3044;&#x307E;&#x3059;&#x3002;\n&#x591A;&#x304F;&#x306E;&#x30E1;&#x30BD;&#x30C3;&#x30C9;&#x306F;Scala&#x306E;Iterable&#x306E;&#x529B;&#x3092;&#x501F;&#x308A;&#x3066;&#x3044;&#x307E;&#x3059;&#x3002;resolve&#x30E1;&#x30BD;&#x30C3;&#x30C9;&#x306F;&#x30A8;&#x30F3;&#x30C6;&#x30A3;&#x30C6;&#x30A3;&#x3092;\n &#x3053;&#x306E;&#x4F8B;&#x306F;&#x30AA;&#x30F3;&#x30E1;&#x30E2;&#x30EA;&#x3067;&#x7BA1;&#x7406;&#x3059;&#x308B;&#x30EA;&#x30DD;&#x30B8;&#x30C8;&#x30EA;&#x3067;&#x3059;&#x304C;&#x3001; resolve&#x3068;iterator&#x3092;&#x5B9F;&#x88C5;&#x3059;&#x308B;&#x3060;&#x3051;&#x3067;&#x5B8C;&#x6210;&#x3067;&#x3059;&#x3002;Iterable&#x3067;&#x30B3;&#x30EC;&#x30AF;&#x30B7;&#x30E7;&#x30F3;&#x3067;&#x4F7F;&#x3048;&#x308B;&#x69D8;&#x3005;&#x306A;&#x30E1;&#x30BD;&#x30C3;&#x30C9;&#x304C;&#x5229;&#x7528;&#x3067;&#x304D;&#x307E;&#x3059;&#x3002;foreach&#x3084;exists&#x3084;map&#x306A;&#x3069;&#x304C;&#x4F7F;&#x3048;&#x307E;&#x3059;&#x3002;\n &#x6B21;&#x306F;&#x66F8;&#x8FBC;&#x307F;&#x304C;&#x3067;&#x304D;&#x308B;&#x30EA;&#x30DD;&#x30B8;&#x30C8;&#x30EA;&#x3067;&#x3059;&#x3002;store&#x3068;&#x304B;delete&#x304C;&#x3042;&#x308A;&#x307E;&#x3059;&#x3002;\n \n \n \n &#x3064;&#x307E;&#x308A;&#x3001;JavaBeans&#x3067;&#x3059;&#x306D;&#x3002;&#x305D;&#x308C;&#x3092;&#x751F;&#x6210;&#x3059;&#x308B;&#x30C4;&#x30FC;&#x30EB;&#x3067;&#x3059;&#x3002;\n &#x5168;&#x90E8;&#x3092;&#x5410;&#x304D;&#x51FA;&#x3059;&#x306E;&#x306F;&#x9AA8;&#x304C;&#x6298;&#x308C;&#x308B;&#x306E;&#x3067;&#x3001;Freemarker&#x3092;&#x4F7F;&#x3044;&#x307E;&#x3059;&#x3002;\n &#x64CD;&#x4F5C;&#x65B9;&#x6CD5;&#x306F;&#x3053;&#x3093;&#x306A;&#x611F;&#x3058;&#x3002;\n \n ClassMeta&#x306B;&#x306F;ID&#x4EE5;&#x5916;&#x306B;&#x3001;&#x30AF;&#x30E9;&#x30B9;&#x540D;&#x3084;&#x30D1;&#x30C3;&#x30B1;&#x30FC;&#x30B8;&#x540D;&#x3001;FieldMeta&#x306E;&#x30EA;&#x30B9;&#x30C8;&#x306A;&#x3069;&#x304C;&#x4FDD;&#x6301;&#x3057;&#x3066;&#x3044;&#x308B;&#x30A8;&#x30F3;&#x30C6;&#x30A3;&#x30C6;&#x30A3;&#x3067;&#x3059;&#x3002;@BeanProperty&#x3084;&#x4ED6;&#x306E;getter&#x306F;JavaBeans&#x3092;&#x524D;&#x63D0;&#x306B;&#x3059;&#x308B;Freemarker&#x306E;&#x305F;&#x3081;&#x306E;&#x30E1;&#x30BD;&#x30C3;&#x30C9;&#x3067;&#x3059;&#x3002;&#x3061;&#x306A;&#x307F;&#x306B;ID&#x306F;String&#x3067;&#x306F;&#x306A;&#x304F;&#x3001;Identifier&#x3068;&#x3044;&#x3046;&#x5024;&#x30AA;&#x30D6;&#x30B8;&#x30A7;&#x30AF;&#x30C8;&#x3092;&#x5229;&#x7528;&#x3057;&#x3066;&#x3044;&#x307E;&#x3059;&#x3002;\n ClassMeta&#x306E;&#x30B3;&#x30F3;&#x30D1;&#x30CB;&#x30AA;&#x30F3;&#x30AA;&#x30D6;&#x30B8;&#x30A7;&#x30AF;&#x30C8;&#x3067;&#x3059;&#x3002;\n1&#x756A;&#x76EE;&#x304C;&#x30D5;&#x30A1;&#x30AF;&#x30C8;&#x30EA;&#x30E1;&#x30BD;&#x30C3;&#x30C9;&#x3001;2&#x756A;&#x76EE;&#x306F;ID&#x306E;&#x81EA;&#x52D5;&#x751F;&#x6210;&#x3002;\n3&#x756A;&#x76EE;&#x304C;&#x30B3;&#x30D4;&#x30FC;&#x7528;&#x306E;&#x30D5;&#x30A1;&#x30AF;&#x30C8;&#x30EA;&#x30E1;&#x30BD;&#x30C3;&#x30C9;&#x3002;\n4&#x756A;&#x76EE;&#x304C;&#x62BD;&#x51FA;&#x5B50;&#x30E1;&#x30BD;&#x30C3;&#x30C9;&#x3067;&#x3059;&#x3002;\n FieldMeta&#x306F;ClassMeta&#x306B;&#x5F93;&#x5C5E;&#x3059;&#x308B;&#x305F;&#x3081;&#x3001;&#x8B58;&#x5225;&#x304C;&#x4E0D;&#x8981;&#x306A;&#x5024;&#x30AA;&#x30D6;&#x30B8;&#x30A7;&#x30AF;&#x30C8;&#x3067;&#x3059;&#x3002;case class&#x3067;&#x3055;&#x304F;&#x3063;&#x3068;&#x4F5C;&#x308A;&#x307E;&#x3059;&#x3002;BeanProperty&#x306F;Freemarker&#x5BFE;&#x5FDC;&#x3067;&#x3059;&#x3002;\n &#x6B21;&#x306F;&#x30EA;&#x30DD;&#x30B8;&#x30C8;&#x30EA;&#x3067;&#x3059;&#x3002;&#x4ECA;&#x56DE;&#x306F;&#x30EA;&#x30FC;&#x30C9;&#x30AA;&#x30F3;&#x30EA;&#x30FC;&#x306A;&#x306E;&#x3067;EntityResolver&#x306E;&#x307F;&#x3067;&#x3059;&#x3002;\n\n &#x6B21;&#x306F;&#x30B3;&#x30FC;&#x30C9;&#x751F;&#x6210;&#x30B5;&#x30FC;&#x30D3;&#x30B9;&#x3067;&#x3059;&#x3002;\n &#x6700;&#x5F8C;&#x306F;&#x30A2;&#x30D7;&#x30EA;&#x30B1;&#x30FC;&#x30B7;&#x30E7;&#x30F3;&#x3067;&#x3059;&#x3002;\n \n