https://kotlinlang.org logo
#announcements
Title
# announcements
n

natpryce

09/05/2017, 12:55 PM
and uses a bitset internally to save space
e

elect

09/05/2017, 1:08 PM
sometimes
Int
representing a group of enums, are used as mask for bitwise operation, afaik
EnumSet
can't do that
and sometimes enums uses an hardcoded int, not contiguous with the previous one
please let me know if I'm wrong
d

diesieben07

09/05/2017, 1:44 PM
removeAll
and
retainAll
on
EnumSet
will use bit-masking operators under the hood when called with an
EnumSet
argument.
e

elect

09/05/2017, 1:57 PM
I'm playing with it right now.. I tried the
+=
operator but unfortunately it complains for ambiguity between the
plusAssing
of Collections and Sets
isn't there a way to solve that?
d

diesieben07

09/05/2017, 2:02 PM
This works fine for me:
Copy code
val set = EnumSet.noneOf(RetentionPolicy::class.java)
set += RetentionPolicy.CLASS
(just the first enum I could find)
e

elect

09/05/2017, 2:04 PM
I have this
Copy code
var windowFlags = EnumSet.noneOf(WindowFlags::class.java)
        if (noTitlebar[0]) windowFlags += WindowFlags.NoTitleBar
where
enum class WindowFlags(val i: Int) {
it looks like that doesnt play nice if you declare some field on the enum
d

diesieben07

09/05/2017, 2:10 PM
Why did you declare it as a
var
? Then you get the ambiguity, because it can either add to the existing set or create a new set and assign it to the
var
.
e

elect

09/05/2017, 2:10 PM
you are right
it works
thanks
d

diesieben07

09/05/2017, 2:10 PM
With a
val
only the former is possible. Really, you should always start with
val
and only move to
var
if you really need it.
And you almost never do.
e

elect

09/05/2017, 2:11 PM
it was
var
because it was an
Int
before
d

diesieben07

09/05/2017, 2:11 PM
Makes sense.
e

elect

09/05/2017, 2:11 PM
I'm trying to migrate and test
anyway, does this instantiate a class?
EnumSet.noneOf
d

diesieben07

09/05/2017, 2:13 PM
It creates a new, empty
EnumSet
. But due to the internal structure of an
EnumSet
you then need to specify the type using a
Class
instance. You could write a function in Kotlin using reified type parameters to avoid having to pass that in explicitly.
e

elect

09/05/2017, 2:15 PM
sorry but I don't get it
it needs a
class type
, not an instance, or?
however atm I'm using this
inline fun <reified E : Enum<E>> enumSetOf(): EnumSet<E> = EnumSet.noneOf(E::class.java)
d

diesieben07

09/05/2017, 2:16 PM
MyEnum::class.java
is an instance of
java.lang.Class
(which is a class itself).
Yes, that's what I was suggesting.
e

elect

09/05/2017, 2:17 PM
and that avoids to create a new instance?
d

diesieben07

09/05/2017, 2:17 PM
It still creates a new, empty
EnumSet
.
But it avoids having to explicitly specify the type of the enum.
e

elect

09/05/2017, 2:19 PM
do you have some tip instead using
contains
?
I'd go with
infixed has
d

diesieben07

09/05/2017, 2:19 PM
You can use Kotlin's
in
operator, which is basically just an alias for `contains`:
MyEnum.A in myEnumSet
e

elect

09/05/2017, 2:21 PM
uhm, but this'd require to invert all the operands
I normally have
if(flags has x)
d

diesieben07

09/05/2017, 2:21 PM
How does that even make sense? 😄 The bitmask has the flag, not the flag has the bitmask.
e

elect

09/05/2017, 2:22 PM
sorry,
flags
anyway, I'll try
d

diesieben07

09/05/2017, 2:23 PM
Ahh, ok. Yes, you can write an infix
has
easily, which delegates to
contains
, if you want to keep the existing order.
e

elect

09/05/2017, 2:29 PM
|
->
add
,
& ~
->
remove
what about
xor
?
d

diesieben07

09/05/2017, 2:32 PM
Really not sure when you would ever need that, but:
if (thing in set) set -= thing else set += thing
So, probably worth another extension.
👍 1
n

natpryce

09/05/2017, 3:34 PM
It would be nice if there was an immutable
EnumSet<T:Enum<T>>
in the Kotlin library. I find Java collection’s default mutability very off-putting now.
k

karelpeeters

09/05/2017, 3:57 PM
You can make it a
Set
reference, then you can't modify it. Maybe
EnumSet
has some more methods though, not sure.
e

elect

09/05/2017, 4:17 PM
at least using
EnumSet
now I can overcome the kotlin limitation of
flags |= property
flags += property
7 Views