《java与模式》中说,创建对象的过程是违背开闭原则和依赖倒置原则,
例如:List<String> lst = new ArrayList<String>();
为什么违背了依赖倒置原则呢?

解决方案 »

  1.   

    不要纠结于这个问题,关于“创建对象的过程违背开闭原则与依赖倒置原则”这句话,如果不在约定“创建对象的过程到底是什么样的前提下”,我个人认为没有讨论的必要。
    “创建对象的过程”,正如其说的,是一个过程,这个过程可能会影响父类,可能会影响基类,可能什么操作都没有(这是针对于对象的构造方法而言)。如果对这么笼统的概念下结论,就有点太以偏概全了,比如下面的代码:
    public class App {

    public static class Hi{
    public Hi(){
    System.out.println("hello world");
    }
    }

    public static void main(String[] args) {
    Hi hi = new Hi();
    }
    }
    好,我创建了一个Hi()对象,这个对象的创建违背了依赖倒置与开闭原则么?如果连那么简单的代码都能违背的“原则”,那算了,还不如不去遵守
    抛开对象的构造函数,如果谈JVM创建对象的话,确实,会违背这些原则,但是它使用的是面向过程的设计思想,如果非要拿OO设计模式去规范,那就,呵呵。
    ==========
    设计模式只是一个工具,没必要去刻意记忆。等代码写到一定程度,自然而然就会用到,你没听过设计模式,也一样。
      

  2.   

    首先谢谢回复。
    其次,你在2楼的意思,我明白,因为我自身也是这么想的。
    只是我在看到这句话的时候,想搞明白这句话的意思,我并非死读书,只是追根究底罢了。
    违背开闭我明白,可为什么会违背依赖倒置呢?
    难道是因为lst依赖于具体类型ArrayList?
    我只是想搞明白这个,谢谢,希望你能再次解释下。
      

  3.   

    因为ArrayList是List的实现,把ArrayList赋值给List类型的lst,就相当于把基类“传递”给父类对象。对lst的操作会级联影响到其所代表的ArrayList,就是对小范围的接口的操作影响到大范围的类了吧。不过这么解释感觉比较生硬,也不贴切,这个问题,其实没必要这么纠结。
      

  4.   

    大神面前献献丑,说说自己的看法,不知道是否合理。
    首先依赖倒置原则的目的是在使用一个类实例时,使用的是抽象类的实例以及抽象类的方法来做操作,这样就不依赖子类的具体实现。那么也就是说我们所期望使用的都是抽象方法,而不是实际操作方法。
    但当我们new一个类的时候,虽然使用了抽象类去代表其实际的子类,但在使用的时候调用的却是这个实际子类中实现的真是方法,而不是抽象方法,也就是有了实际的类型。这就与依赖倒置原则产生了冲突,也就违反了依赖倒置原则。
    一句话就是依赖倒置就是期望所有都是抽象的,无论类或者是其方法,都要使用抽象来实现。而new的时候出现了实际的实例,不是抽象,因此违反。
      

  5.   

    依赖抽象? 抽象能给我对象吗.难道我要搞一个 ListFactory 来创建ArrayList对象么 哈哈哈哈 你的当我是来捣乱的吧