Java:声明和初始化的最佳实践

4

我认为自己在Java方面经验丰富,但仍有一些基础知识不是很确定。

我总是尽力编写易于维护和阅读的代码,并且追求最高效率。例如,仅在真正需要时才调用“new”运算符。

这是因为我不想无谓地分配内存。但支持变量怎么办?

许多人倾向于声明一个字符串仅仅为了赋值一些冗长的方法调用,例如:

String helper = Class.method1().method2(param).getter();

我总是在想这是否会分配比必要更多的内存。getter已经返回一个新对象,现在还通过引用分配了更多内存。当我使用getter超过一次时,帮助程序很方便,但如果只需要一次,直接传递该方法岂不更好? 这实际上是否会将内存分配到堆上?

Object a, b, c, d, e ,f , g, h, i, j ...;

我希望一些比我更有经验的Java专家能告诉我如何处理这种基础的东西。谢谢 :)


2
在你的例子中,_堆栈_上使用的内存会更多,但不会在 上使用。虽然使用了一点点内存,但是它并不值得担心。重要的是,通过给字符串取一个有意义的名称,你让你的代码稍微更加自注释,从而更容易阅读。 - Dawood ibn Kareem
“getter”返回一个新的对象已经……-不,通常情况下并不是这样,如果它只返回对其调用对象成员的引用,那么大多数getter方法都是这种情况。 - Jesper
更重要的是,Class.method1().method2(param).getter() 这种写法明显违反了德米特法则(最少知识原则),使得代码与其依赖紧密耦合,因此更难以维护。 - Mick Mnemonic
我总是尽力编写易于维护、易于阅读的代码,并追求最高效率。例如,只有在真正需要时才调用"new"操作符。 而"Class.method1().method2(param).getter();"这样的代码,你和猴子一起工作吗?他们有没有读过《代码整洁之道》? - underwater ranged weapon
2个回答

1

这个代码实际上是否将内存分配给堆? 不是,它是在栈上分配的。全局变量是在堆上分配的。

当方法结束时,它会返回从栈中获取的已分配内存空间,而该变量将不再受到任何影响。

我一直想知道这是否会分配比所需更多的内存 它将在栈上为变量的引用分配内存。如果将函数作为参数传递,则不需要此引用。但是,函数仍必须被评估,并且其返回值放置在堆栈上。如果为其声明一个变量,则必须执行几次额外的写入和读取操作,在今天高效的计算机方面,这在大多数情况下应该不会受到任何影响。


0

如果成员只能通过访问器("setter"方法)来设置,我更喜欢第一种风格。它提供了一个提示,即初始化值是构造时的默认值。

如果成员可以在构造期间指定,则通常从较少参数的构造函数向适当的构造函数传递默认值。例如,

final class Example {

  private final String name;

  Example() {
    this("My Example");
  }

  Example(String name) {
    this.name = name;
  }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接