gpt4 book ai didi

java - 内存有效的子类化方式

转载 作者:行者123 更新时间:2023-11-29 07:10:38 26 4
gpt4 key购买 nike

尝试为此提出一个有意义的问题标题是很棘手的。我会准确解释我要做什么。

我创建了一个 Android 图形库,它构建了一个可能很大的 Path 对象列表。我现在需要将一些附加数据附加到每个 Path。为此,我简单地将 Path 子类化(称之为 PathSubclass)以提供额外的扩展数据字段。在一般用例中,这些 Path 对象中只有极少数实际上会在其上设置额外的数据。例如,可能有一个包含数千个 PathArrayList,但只有少数具有附加数据。在开发库时,我想附加到每个 Path 的额外数据量可能会显着增加。我明白这可能是过早的优化,但我担心当附加数据很少填充并且使用相当大的对象集合时,将对象子类化以包含一些附加数据效率不高。

我想做的可能是有一个 ExtendedPathData 类,与我的 Path 子类分开。因此,每个 Path 子类只是因为需要一个 mExtendedData 成员而变得有点臃肿,在许多情况下,该成员将是 null,除了那些非常需要额外数据的几个 Path 对象。我想这类似于通常使用 setTag() 方法将附加数据附加到 View 的方式。

是否有任何其他我应该考虑的方法,出于任何原因更好?

最佳答案

您可以使用组合而不是继承。

想法一

PathData 类可能包含对PathExtendedPathData 的引用:

// encapsulate properly in your code, this is
// just a short sample
class PathData {
public Path path;
public ExtendedPathData data;
}

这使您能够将 data 成员设置为 null。每个 PathData 实例的大小始终为两个引用。当 ExtendedPathData 中的成员数量增加时,实际内存消耗只会增加具有非空 dataPathData 实例。

想法 2

您可以通过使用具有两个实现的接口(interface)来减少一个引用:

interface PathData {
Path path();
ExtendedPathData data();
}

final class NullPathData implements PathData {
Path path;
public Path path() { return path; }
public ExtendedPathData data() { return null; }
}

final class ExtendedPathData implements PathData {
Path path;
ExtendedPathData data;
public Path path() { return path; }
public ExtendedPathData data() { return data; }
}

由您决定拥有两个实现是否真的值得编写代码,因为您需要一个工厂方法来决定使用哪个实现。每个实例一个 4 字节引用...

更多内容

如果 ExtendedPathData不可变的 并且可能存在许多相同的实例,您还可以通过公开一个静态工厂方法来合并它们使用实例池而不是公共(public)构造函数。

如果你有 Effective Java by Joshua Bloch ,这里有进一步的引用资料,详细解释了提示(在更一般的上下文中):

  • 项目 1 考虑静态工厂方法而不是构造函数
  • 第 16 条:组合优先于继承

关于java - 内存有效的子类化方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14193461/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com