Yes, that's my understanding. This blog gives a reasonable overview:
  http://www.dustinmartin.net/2009/10/getters-and-setters-in-scala/

Kind of sad that a year or so in we are just figuring this out, but I guess
better late then never. :-)

-Jay

On Fri, May 25, 2012 at 2:13 PM, Joel Koshy <jjkosh...@gmail.com> wrote:

> Personally, I like options 3 and 4. (Option 4 more than 3, but I'm not sure
> I follow it correctly - and I did not know that shorthand for overloading!
> So is this right:)
>
> class GetSetXYZ {
>  private var underlying = 10
>  def xyz = underlying
>  def xyz_=(x: Int) {underlying = x}
> }
>
> val o = new GetSetXYZ
> println(o.xyz) // 10
> o.xyz=5
> println(o.xyz) // 5
>
> On Fri, May 25, 2012 at 10:17 AM, Jay Kreps <jay.kr...@gmail.com> wrote:
>
> > Oh no, you are no using xyz_() you are overriding =. So you define
> >  xyz_=(x:Int)
> > but to call it you do
> >  o.xyz = 5
> > The reason this is nice is because you can start with a simple
> >  var xyz
> > and not need any getter/setter. Then later when you need to change the
> > behavior of the get you make
> >  def xyz = ...
> > and none of the calling code changes. Later still you decide you need to
> > override the setter you do
> >  def xyz_=(x: Int)...
> > and that overrides o.xyz=5, again without changing the calling code.
> >
> > Basically the point is that scala generates these getters and setters no
> > matter what so you might as well use the official scala mechanism.
> >
> > Since I am only semi-scala literate any of the above may be wrong.
> >
> > -Jay
> >
> > On Fri, May 25, 2012 at 9:42 AM, Jun Rao <jun...@gmail.com> wrote:
> >
> > > I think separating out the getter and setter makes the implementation
> > > cleaner. I am not sure how intuitive it is to use xyz_() as the setter,
> > > although it is concise.
> > >
> > > Thanks,
> > >
> > > Jun
> > >
> > > On Tue, May 22, 2012 at 9:13 PM, Jay Kreps <jay.kr...@gmail.com>
> wrote:
> > >
> > > > We are a little inconsistent in our use of setters and getters. I
> think
> > > for
> > > > the most part well-written code shouldn't have too many setters and
> > > getters
> > > > (especially setters) since they expose internal details of the
> object.
> > > But
> > > > sometimes you need them. I see three common conventions:
> > > >
> > > >   1. Java-style getXyz() and/or setXyz() method
> > > >   2. xyz() plus semantically named setter that describes what it
> does.
> > > >   3. In some newer code I see xyz(x: Option[Int])
> > > >
> > > > There is also a forth option. My understanding of the proper scala
> > idiom
> > > > was actually that scala automatically created get and set methods for
> > > you,
> > > > and the appropriate thing to do is to override these. This is
> described
> > > > here:
> > > http://www.codecommit.com/blog/scala/scala-for-java-refugees-part-2
> > > >
> > > > Essentially you can start with just
> > > >
> > > >  val xyz = ...
> > > >
> > > > Then later if you want to override the getter you would do
> > > >
> > > >  private val x = ...
> > > >
> > > >  // getter
> > > >
> > > >  def xyz = if(check_something) x else throw new IllegalStateException
> > > >
> > > > Then if you also want to add a setter you do
> > > >
> > > >  private val x = ...
> > > >
> > > >  def xyz = if(check_something) x else throw new IllegalStateException
> > > >  def xyz_=(x: Int) {xyz = x}
> > > >
> > > > Let's pick one of these and refactor towards it as we see code that
> > > doesn't
> > > > match. My vote would be for option 4.
> > > >
> > > > -Jay
> > > >
> > >
> >
>

Reply via email to