views:

89

answers:

2

I tend to have this redundant naming in case classes:

abstract class MyTree
case class MyTreeNode (...)
case class MyTreeLeaf (...)

Isn't it possible to define Node and Leaf inside of MyTree? What are best practices here?

+1  A: 

I wouldn't recommend putting the case classes inside their abstract superclass because nested classes are path dependent in Scala. If anything, you could put them inside a companion object.

abstract class MyTree
object MyTree {
  case class Node (...) extends MyTree
  case class Leaf (...) extends MyTree
}

(note: I haven't tested this...)

Ben Lings
+4  A: 

Since class, trait and object names are package scoped, why not use the package to provide insurance against aliasing with other nodes and leafs and call them simply Node and Leaf, while leaving them outside any other scoping construct (i.e., an object)?

Randall Schulz
What is the difference between package and companion object?
Łukasz Lew
Package objects are scopes that can hold any kind of Scala entity, particularly those that cannot really appear at the top level / globally due to JVM restrictions. You can put `def`, `val` (or `var`) and `type` declarations in package objects but only traits, classes and objects at the top level. Companions are class / object pairs (that share a name) and which are defined in the same source file. Companions can access each other's private members.
Randall Schulz