相关疑难解决方法(0)

如何减少Scala中创建的对象数量?

我在Scala中编写了一个计算机图形应用程序,它使用RGB类来返回图像中某个点的颜色.可以想象,返回颜色RGB对象的函数被多次调用.

class RGB(val red: Int, val green: Int, val blue: Int) { }
Run Code Online (Sandbox Code Playgroud)

有一个函数getPixelRGB,经常使用如下

val color:RGB = getPixelRGB(image, x, y)
Run Code Online (Sandbox Code Playgroud)

问题是我可能会将这个函数调用一百万次,我相信这会生成一百万个唯一的RGB对象实例,这是一个非常不吸引人的情况.我对此有一些想法:

  1. getPixelRGB可能会创建无限数量的对象(如果它被无限次调用),但它不一定是无限数量的对象,因为只有最多可以为RGB生成255*255*255种可能的组合.所以创建的对象数量"应该"是有限的.可以调整此函数以使用对象池,如果要返回相同的颜色,则可以返回该颜色之前的相同池化对象实例.

  2. 我可以将这个RGB编码为Int.Int比普通的Scala/Java对象具有更少的内存开销,Java对象有额外的内存开销.由于Scala Int类型的宽度为4个字节,因此前3个字节可以存储RGB值.仅从getPixelRGB方法返回Int而不是RGB将会减少我假设的内存开销.但是如何在仍然拥有RGB类的说服力的同时做到这一点?

  3. 据说,它们是短暂存在的对象,我已经读过垃圾收集器应该快速重新声明它们.不过我还是很担心.GC如何知道我快速扔掉它?太混乱了.

所以一般来说,我的问题是如何使这个getPixelRGB更加内存友好?我还应该担心吗?

memory garbage-collection jvm memory-management scala

11
推荐指数
2
解决办法
1237
查看次数

用户定义的值类从Java看起来是什么样的?

我想通过与Haskell的比较,我理解Scala 2.10的新"值类"特性newtype:

trait BoundedValue[+This] extends Any { this: This =>

  def upperBound: This

  def lowerBound: This

}

class Probability @throws(classOf[IllegalArgumentException]) (v: Double) extends AnyVal with BoundedValue[Probability] {

  val value: Double = if ((v >= 0.0) && (v <= 1.0)) v else throw new IllegalArgumentException((v.toString) + "is not within the range [0.0, 1.0]")

  override val upperBound: Probability = new Probability(0.0)

  override val lowerBound: Probability = new Probability(1.0)

  // Implement probability arithmetic here;
  // will be represented by Double at …
Run Code Online (Sandbox Code Playgroud)

java interop scala scala-java-interop newtype

8
推荐指数
1
解决办法
1868
查看次数

java.lang.Integer不能使用Scala中的任何类型转换为java.lang.Byte错误

我可以将Int数据转换为Byte.

scala> 10.asInstanceOf[Byte]
res8: Byte = 10
Run Code Online (Sandbox Code Playgroud)

但是,如果使用任何类型的相同值,则转换会引发错误.

scala> val x : Any = 10
x: Any = 10

scala> x.asInstanceOf[Byte]
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Byte
    at scala.runtime.BoxesRunTime.unboxToByte(BoxesRunTime.java:98)
    at .<init>(<console>:10)
Run Code Online (Sandbox Code Playgroud)

我可以投两次.

scala> val y = x.asInstanceOf[Int]
y: Int = 10

scala> y.asInstanceOf[Byte]
res11: Byte = 10
Run Code Online (Sandbox Code Playgroud)

还有比这更好的方法吗?

types scala

4
推荐指数
1
解决办法
3201
查看次数