论坛首页 Java企业应用论坛

基础知识: 需求!

浏览 109741 次
该帖已经被评为精华帖
作者 正文
   发表时间:2004-08-21  
我看不出这个例子是什么意思
0 请登录后投票
   发表时间:2004-08-21  
其实, 这点相当关键. 我只是从来没有认为这里面会有不同意见.

如果能够证明: 用了静态工厂之后, 影响了外部的一些必须要的设计的灵活性, 那么静态厂自然是错误的.

所谓必须要, 我这里要给出一点说明:
1. 外界要求继承我不认为是个合理的要求. 能否继承, 是类设计者说了算的. 只要我给了你定制, 抽象的能力(比如, 通过接口组合), 你就没有足够的权利来要求继承我. 我要final自然有我的道理.

2. 外界要求用一个特定的函数名字(比如构造函数的名字)来调用我也不认为是个合理的要求. 这在接口编程里是常识. 你因为Object提供了equals()而不是isEquals()而愤慨? 那是你自己的事. 你因为Calendar没有公开构造函数所以你被迫调用静态工厂? 我仍然不认为这是一个合理的抱怨. 你可以adapter的呀
这些基本的契约只能是强制的.
0 请登录后投票
   发表时间:2004-08-21  
potian 写道
我看不出这个例子是什么意思

嗯? 这不是外部要求实现的singleton吗? 那你是什么意思?
看来还是有误会. 障碍重重啊.

那么, 我实在不得不要求你给出一个你心目中当构造函数公有的时候, 你怎么可以自由地singleton的例子. 然后我来试试基于我的静态厂来达到同样的要求
0 请登录后投票
   发表时间:2004-08-21  
对每一个类要求继承自然是不合理的,但绝大部分的类都不可以继承我是不同意的,这是OO的基本设施

第二点理论上我同意,getInstance和new 是一样的。但既然Java已经提供了new,getInstance应该算是额外的了。还有一个重要的问题是大家都已经认同了这个new,不然的话,你去getInstance,我去instance,所以从名字本身的角度来讲,new比getInstance要好
0 请登录后投票
   发表时间:2004-08-21  
ajoo 写道
potian 写道
我看不出这个例子是什么意思

嗯? 这不是外部要求实现的singleton吗? 那你是什么意思?
看来还是有误会. 障碍重重啊.

那么, 我实在不得不要求你给出一个你心目中当构造函数公有的时候, 你怎么可以自由地singleton的例子. 然后我来试试基于我的静态厂来达到同样的要求

我试着来理解一下,我现在可以用XSingleton得到XSingleton.instance,即

I x = XSingleton.instance()

第一个程序里面我已经在使用了,然后我在另一个程序里面发现我并且需要lazy intialization,这个时候我怎么办?或者第一个程序里面建立的是X的实例,第二个程序里面需要Y的某个实例(同样实现I),那我怎么办?
0 请登录后投票
   发表时间:2004-08-21  
potian 写道
对每一个类要求继承自然是不合理的,但绝大部分的类都不可以继承我是不同意的,这是OO的基本设施

第二点理论上我同意,getInstance和new 是一样的。但既然Java已经提供了new,getInstance应该算是额外的了。还有一个重要的问题是大家都已经认同了这个new,不然的话,你去getInstance,我去instance,所以从名字本身的角度来讲,new比getInstance要好


对继承, 我的观点是每个类具体分析. 给每个类的作者自由选择是否允许继承的权利. 至于继承是否重要到是oo的基本设施,这又是一个大坑.
你可以看看c++世界对java只支持单继承的批判, 也可以看看很多人对接口组合代替继承的阐述, 这世界并不是只有一种声音的.

对名字, 有两个方面. 有好的, 因为静态工厂方法可以命名, 于是你可以起比较有意义的名字. 这点你可以看看我给的哪个连接里他举的例子.
另一方面是不好的,就是静态方法没有约定. 所以学习成本和复杂度有所提高.
0 请登录后投票
   发表时间:2004-08-21  
potian 写道
ajoo 写道
potian 写道
我看不出这个例子是什么意思

嗯? 这不是外部要求实现的singleton吗? 那你是什么意思?
看来还是有误会. 障碍重重啊.

那么, 我实在不得不要求你给出一个你心目中当构造函数公有的时候, 你怎么可以自由地singleton的例子. 然后我来试试基于我的静态厂来达到同样的要求

我试着来理解一下,我现在可以用XSingleton得到XSingleton.instance,即

I x = XSingleton.instance()

第一个程序里面我已经在使用了,然后我在另一个程序里面发现我并且需要lazy intialization,这个时候我怎么办?或者第一个程序里面建立的是X的实例,第二个程序里面需要Y的某个实例(同样实现I),那我怎么办?


你这个论述我没有看懂. 所以我用老办法复述都不知道从哪开始.
还是请你给一个例子, 让我看看你说的用了构造函数就可以得到的灵活性是什么样子的. (我有点怀疑的是, 这个论断最后还要追溯到某一个容器不支持静态工厂上)
0 请登录后投票
   发表时间:2004-08-21  
你这个XSinglton和X之间什么关系,好像不是静态工厂了
0 请登录后投票
   发表时间:2004-08-21  
我理解的外部创建逻辑就是不知道在哪个package, 哪层, 有一个模块想要控制X的实例的生成(比如想singleton一下). 所以才写了那么个东西出来.
这不是你说的外界可以自由采取各种创建逻辑吗?

如果我理解错了, 没关系. 盼望你能写一个使用构造函数的例子. 不需要太详细, 什么api的名字, 具体语法都不重要, 示意即可.

对着例子, 讨论就会容易许多. 误会也会少很多.
0 请登录后投票
   发表时间:2004-08-21  
我明白了



假设X最早是为了集群环境建立的,内部使用了JDBC来建立singleton,现在我不想要那个JDBC的依赖,怎么办呢

第一个程序里面继续还要JDBC
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics