为何构造函数中少作事情好呢?

jayli426 2008-07-28 02:25:16
例如有个类
Class A
{
public A()
{
}

public A(Ojbect value)
{
initValue();
}

public void initValue(Ojbect value)
{
}

}


但是用的时候,我看一般都倾向与
这样用
即先构造,然后再初始化
A a = new A()
a.initValue(new Object());

而不是

A a= new A(Object value);

为何一般采取第一种选择呢?
...全文
154 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
greathawker 2008-07-30
  • 打赏
  • 举报
回复

如果构造函数抛错, 不好跟踪.
huaya23 2008-07-29
  • 打赏
  • 举报
回复
个人看法!
magicxin031 2008-07-29
  • 打赏
  • 举报
回复
thinking in java第七章中讲构造器内部的多态方法行为时讲到过编写构造器的时候有一条有益原则:尽可能用简单的方法使对象进入正常状态,如果可以得话,避免调用其他方法。在构造器唯一能能够安全调用的那些方法是基类(父类)中的final方法。
这是因为当构造器中有多态方法时的构造器调用方法与一般方法不同,为了避免这种调用方法的不安全性而定的。这与楼主的“不要让构造器做太多事”是否有关有待查证……
ZangXT 2008-07-29
  • 打赏
  • 举报
回复
我怀疑lz是不是看C ++的书看的,C++有的书里有这样的提法.
因为C++需要程序员自己回首内存,当在构造函数中出问题的时候,对象没有构造,所以无法调用析构函数,这样很多分配的 内存,打开的文件等就无法处理了.所以可能在构造方法中尽量少做事情好.
但是java中由于垃圾自动回收,以及比较好的异常处理机制,可以避免这些问题,我感觉应该不存在这个说法吧.
个人推断,仅供拍砖
jayli426 2008-07-29
  • 打赏
  • 举报
回复
好像答案都不是很ok哦?
finalzhzhk 2008-07-28
  • 打赏
  • 举报
回复
“不要让构造函数做太多的事情 ”
实际应用中可以更加灵活。
比如我们做的项目中,需要做权限控制,那么没有某个组件的权限就不初始化。
(为什么不控制在new呢,因为是反射机制加载的。)
ZangXT 2008-07-28
  • 打赏
  • 举报
回复
在C++ 里好像有这样的说法 ,忘了在哪本书看的了.
不过设计到初始化的话最好还是在构造函数里进行,只要这样才能确保调用.
justinavril 2008-07-28
  • 打赏
  • 举报
回复
既然你知道功能一样 那就是说没有区别 那不同的编写习惯就倾向于不同的使用习惯呗...
jishu_vip 2008-07-28
  • 打赏
  • 举报
回复
不要让构造函数做太多的事情

这个还没有听说过!
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wenzheng38 的回复:]
不带参数的也可以不写啊,编译时有默认的构造函数
但是带参数的构造函数往往是对类内的私有成员变量进行初始化的
[/Quote]
当然可以不写,最后写上为好,我觉得。
ZangXT 2008-07-28
  • 打赏
  • 举报
回复
设计构造函数的初衷就是为了确保进行初始化工作,避免用户忘记了执行init方法导致的问题.
wenzheng38 2008-07-28
  • 打赏
  • 举报
回复
不带参数的也可以不写啊,编译时有默认的构造函数
但是带参数的构造函数往往是对类内的私有成员变量进行初始化的
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 yousite1 的回复:]
没有一般采取第一种选择这种说法吧,呵呵
因为你显式的声明了带参的构造函数, public A(Ojbect value) ,如果你没加上public A()不带参的
构造函数会导致执行A a = new A() 时会出错,所以当然要加显式的写上这个
不带参的构造函数了.

[/Quote]
也就是说没区别?
其实默认的都最好写上。
JeffFang 2008-07-28
  • 打赏
  • 举报
回复
好像我在哪本书里看到的,不要让构造函数做太多的事情
hmilj245216 2008-07-28
  • 打赏
  • 举报
回复


只是习惯问题
yousite1 2008-07-28
  • 打赏
  • 举报
回复
没有一般采取第一种选择这种说法吧,呵呵
因为你显式的声明了带参的构造函数, public A(Ojbect value) ,如果你没加上public A()不带参的
构造函数会导致执行A a = new A() 时会出错,所以当然要加显式的写上这个
不带参的构造函数了.
  • 打赏
  • 举报
回复
我觉得没区别。

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧