4

First of all I'm developing a parser for an XML-based format for 3D graphics called XGL. But this question can be applied to any situation when you have fields in your class that are optional i.e. the value of this field can be missing.

As I was taking a Scala course on coursera there was an interesting pattern when you create an abstract class with all the methods you need and then create a normal fully functional subclass and an "empty" singleton subclass that always returns false for isEmpty method and throws exceptions for the other ones.

So my question is: is it better to just assign null if the optional field's value is missing or make a hierarchy described above and assign it an empty singleton implementation?

Joachim Sauer
11k3 gold badges54 silver badges45 bronze badges
asked Nov 23, 2012 at 9:16
1

2 Answers 2

3

I also attended the same Scala course and I agree with e-i-s that you should use the Option[T] type for implementing an optional field. Here are some more ideas.

The pattern involving

  • a trait with method isEmpty
  • several classes or objects extending the trait
  • a unique object whose method isEmpty always returns true

is also used to implement sequence-like immutable structures such as lists, streams, and so on.

Compare:

  1. An Option[T] type containing the values Some(t), for each value t in T, and the additional value None.
  2. A List[T] type containing objects built from two subclasses (and their respective constructors) Cons[T](h: T, t: List[T]) and Nil: these represent immutable lists whose elements have type T. Note that here the method Nil.isEmpty returns true.

None indicates the absence of a value, while Nil indicates an empty list.

So an optional value None is not the same as an empty list Nil.

NOTE

If you need to test if an optional value is defined or not you can use the isEmpty method of the Option type, or pattern matching:

class MyClass(f: Option[String])
{
 val field = f
}

and then, to test if the field of an instance obj of MyClass is defined:

if (obj.field.isEmpty)
{
}
else
{
}

or

obj.field match
{
 case Some(s) => /* do something with s */
 case None => /* ... */
}
answered Nov 23, 2012 at 10:09
2

If your implementation is in Scala, it is idiomatic to use the Option[T] type.

answered Nov 23, 2012 at 9:47
4
  • 1
    Wow, that's really helpful. I'm also using this code from java app. How will java work with Option[T]? Should I provide some additional methods? Because with null it's simple: if (object.field() != null) {...} Commented Nov 23, 2012 at 10:03
  • 1
    I'm not sure, but I think you can call Option's isEmpty from Java to check if there's any value (the equivalent to if (object.field() == null) { ... }). But I haven't tried this. Commented Nov 23, 2012 at 10:25
  • 2
    Using Option core methods isEmpty()/isDefined() and get() works perfectly fine from Java. Commented Nov 23, 2012 at 10:50
  • And you have Option.option2Iterable, so you can use Options in enhanced for-loops. Commented Nov 23, 2012 at 14:44

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.