2017-07-26 85 views
3

我确实认为自己在Java方面非常有经验,但仍然存在一些我不太确定的小问题。Java:声明和初始化的最佳实践

我总是尝试写出可维护,易读的代码,并以最高的效率为目标。 例如,我只在真正需要时才调用“新”操作符。

这是因为我不想不必要地分配内存。 但支持变量呢?

很多人都倾向于来声明一个String刚分配这样一些长期的屁股方法调用:

字符串帮手= Class.method1()方法2(PARAM).getter();

我总是怀疑这是不是分配比需要更多的内存。 getter已经返回一个新的对象,现在通过引用它来分配更多的内存。 当我多次使用此getter时,辅助字符串很方便,但是如果只需要一次,直接传递该方法而不是声明新变量会更好吗? 这是否真的将内存分配给堆?对象a,b,c,d,e,f,g,h,i,j ...;以及对象a,b,c,d,e,f,g,h,i,j ...;

我希望一些比我更有经验的Java人能告诉我他们是如何处理这样的基本事情的。谢谢! :)

+1

在你的例子中,在_stack_上会使用更多的内存,而不是_heap_。这是一个很小的数目,不值得担心。重要的是,通过给字符串一个有用的名字,你可以使你的代码更加自我记录,因此更具可读性。 –

+0

“getter函数已经返回一个新的对象......” - 不,通常情况下,如果它只是返回一个被调用对象成员的引用,就像大多数getter方法一样。 – Jesper

+0

实际上更重要的是'Class.method1()。method2(param)。getter()'是公然违反[Demeter法](https://en.wikipedia.org/wiki/Law_of_Demeter)(最少知识原则),使得代码与其依赖关系紧密结合,因此更加困难保持。 –

回答

0

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

如果可以在构造过程中指定成员,我通常会使用较少的参数将默认值从构造函数传递给适当的构造函数。例如,

final class Example { 

    private final String name; 

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

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

} 
1

这是否真的将内存分配给堆? 不,它被分配在堆栈上。全局变量分配在堆上。

当你的方法完成时,它将返回从堆栈中取出的分配的memoryspace,并且该变量不再有任何问题。

我一直在想,如果这不会分配更多的内存 它会分配堆栈上的内存以引用变量。如果您将函数作为参数传递,则不需要此引用。但是,该功能仍需进行评估,并且返回值放置在堆栈上。如果你为它声明了一个变量,那么必须执行一些额外的写入和读取操作,在大多数情况下,这对于当今高效的计算机来说应该没有任何问题。