我正在编写我的第一个 Android 应用程序(以及过去 15 年来我的第一个 Java 应用程序)。它采用编码字符串并将代码转换为绘图操作。一些代码代表梯度定义,这是我的问题所关注的。
如果我理解正确,尝试在onDraw
函数期间创建任何类型的新对象(在我的扩展View
类中重写)将导致 lint 输出警告,建议您缓存对象并且在 onDraw 期间永远不会分配新对象。所以我决定尝试对代码字符串定义的所有渐变进行缓存。这样,如果您以相同的大小重绘相同的代码,则不必重新分配该代码定义的渐变。
我在尝试为 定义密钥结构时遇到了问题HashMap
,我认为这是缓存的最佳结构。如果我可以简单地使用将渐变定义为键的代码片段(字符串)会很好,但我认为这不会很好,因为如果调整图片大小,代码保持不变,但渐变必须随图片改变大小。所以要么我不能对不同大小的相同梯度有相同的键,要么每次调整图片大小时我都必须清除缓存。
这导致我尝试为HashMap
. 稍微阅读一下 Java,我发现它不支持元组,因为据我所知,它不支持像 C# 这样的值类型。因此,推荐的创建复合键的方法是创建一个新类。所以我开始创建一个新类来表示复合键。然后我意识到我又回到了原点。如果我必须创建一个引用类型对象来表示键,lint 会给我一个关于在 onDraw 期间分配内存的警告,对吧?(或者即使没有,我也会在 onDraw 期间分配内存,这是我们试图避免的。)
我在这里需要一些专家建议。我是否正在为优化而移动,这更像是一种指导而不是规则,我应该只根据需要创建渐变吗?我应该使用代码作为HashMap
键并在每次大小更改时清除缓存吗?字符串操作(例如子字符串)是否也需要我试图避免的内存分配?Java 是否支持自定义值类型?我是否需要编写自己的替代品HashMap
来接受一系列值类型作为键而不分配堆内存?