需要知道在这种情况下哪种变量处理方法更有效

Posted

技术标签:

【中文标题】需要知道在这种情况下哪种变量处理方法更有效【英文标题】:Need to know which method of variable handling would be more efficient in this case 【发布时间】:2011-06-03 19:34:17 【问题描述】:

现在我有一个配置阅读器类,它通过一个文本配置文件并将它找到的值添加到我之前声明的变量中。然后将所有这些变量传递给构造函数。不用说,它很乱,看起来像这样:

String buttonText = "";
String buttonPassword = ""; 
String buttonAction = ""; 
String buttonFont = "";
int buttonPosX = 0;
int buttonPosY = 0;
int buttonWidth = 0;
int buttonHeight = 0;
int buttonFontSize = 0;
int buttonFontColor = 0;
int buttonBgColor = 0;
int buttonLayoutPosition = 0;

// Gathering information here ...

parent.addButton(buttonText, buttonPassword, buttonPosX, buttonPosY, buttonLayoutPosition, buttonWidth, buttonHeight, buttonAction, buttonFont, buttonFontSize, buttonFontColor, buttonBgColor);

有没有更好的方法来做到这一点?我听说过地图,这是一个使用地图的好地方吗?我要牢记效率,还要考虑代码的可读性和维护性。

【问题讨论】:

【参考方案1】:

您可以创建一个ButtonConfig 类,将所有这些值作为字段。然后,您只需将单个对象传递给 c'tor。根据整个程序的组织,将初始化所有配置参数的代码移动到配置类本身可能是有意义的。

【讨论】:

【参考方案2】:

如果你使用 Eclipse,你可以在上下文菜单中选择

->重构->提取类

创建一个数据对象。 该数据对象只需写入一次,并将作为整个对象传递给构造函数。

这是一种有价值的地图替代方案,因为您不会丢失类型验证和 javadocs 等。

您的代码将如下所示:

public static class Data

  String buttonText = "";
  String buttonPassword = ""; 
  String buttonAction = ""; 
  String buttonFont = "";
  int buttonPosX = 0;
  ...


...
private Data data = new Data();
...
parent.addButton(data);
...

Eclipse 为您执行此操作的对话框如下所示:

【讨论】:

哇,我不知道你能做到这一点。有这个标准吗?如果我使用这种方法,其他人会不会拉“他在做什么?”查看我的代码时? 一直在用,和我的回答基本一样。这不会阻止某人想知道“他在做什么?”;你只需要忍受这种风险。 :) 这是一种相当标准的方法,一点也不壮观。您可以将其用于某些...【参考方案3】:

这是一个旧线程的链接,但它准确地解释了我会做什么,我会使用构建器模式: Managing constructors with many parameters in Java

【讨论】:

【参考方案4】:

(顺便说一下,这里将String 初始化为“”是没有意义的。)

您可能希望使用HashMap 构造StringObjectMap,然后将其传入。这是传递任意键值集的简单方法。 Properties 对象也可能是合适的,因为该类可以从文件中读取键值对,尽管所有对象都被视为文本。

效率高吗?那里真的没有太多开销,不。我不认为这是一个紧密的循环,所以在你证明它太慢之前,不要担心。

【讨论】:

谢谢@Sean Owen,我会研究一下HashMaps,看看它在可读性方面是否更漂亮。我的意思是,发生的事情很简单,但我不喜欢在编程中排长队,所以理想情况下我想传递某种 Map。

以上是关于需要知道在这种情况下哪种变量处理方法更有效的主要内容,如果未能解决你的问题,请参考以下文章

在 spark RDD 中应该使用哪种方法来处理这种情况。解释?

在 Java 中处理 ResultSet 的有效方法

为啥如果我得到计算对象中的对象属性未定义而不是对象本身?哪种方法更适合这种情况?

如何更快速有效的收集Android应用的FPS

Unity如何优雅地移动物体-8个方法

在 C# 中逐行读取文件