and uses a bitset internally to save space
# announcements
n
and uses a bitset internally to save space
e
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
removeAll
and
retainAll
on
EnumSet
will use bit-masking operators under the hood when called with an
EnumSet
argument.
e
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
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
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
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
you are right
it works
thanks
d
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
it was
var
because it was an
Int
before
d
Makes sense.
e
I'm trying to migrate and test
anyway, does this instantiate a class?
EnumSet.noneOf
d
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
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
MyEnum::class.java
is an instance of
java.lang.Class
(which is a class itself).
Yes, that's what I was suggesting.
e
and that avoids to create a new instance?
d
It still creates a new, empty
EnumSet
.
But it avoids having to explicitly specify the type of the enum.
e
do you have some tip instead using
contains
?
I'd go with
infixed has
d
You can use Kotlin's
in
operator, which is basically just an alias for `contains`:
MyEnum.A in myEnumSet
e
uhm, but this'd require to invert all the operands
I normally have
if(flags has x)
d
How does that even make sense? 😄 The bitmask has the flag, not the flag has the bitmask.
e
sorry,
flags
anyway, I'll try
d
Ahh, ok. Yes, you can write an infix
has
easily, which delegates to
contains
, if you want to keep the existing order.
e
|
->
add
,
& ~
->
remove
what about
xor
?
d
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
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
You can make it a
Set
reference, then you can't modify it. Maybe
EnumSet
has some more methods though, not sure.
e
at least using
EnumSet
now I can overcome the kotlin limitation of
flags |= property
flags += property