这个春季教程的不良做法?

时间:2012-01-08 19:42:01

标签: java spring spring-mvc

我正在关注spring tutorial

在“3.2。为业务逻辑添加一些类”一节中,创建了一个接口ProductManager

package springapp.service;

import java.io.Serializable;
import java.util.List;

import springapp.domain.Product;

public interface ProductManager extends Serializable{

    public void increasePrice(int percentage);

    public List<Product> getProducts();

}

然后创建一个SimpleProductManager实现类:

package springapp.service;

import java.util.List;

import springapp.domain.Product;

public class SimpleProductManager implements ProductManager {

    public List<Product> getProducts() {
        throw new UnsupportedOperationException();
    }

    public void increasePrice(int percentage) {
        throw new UnsupportedOperationException();        
    }

    public void setProducts(List<Product> products) {
        throw new UnsupportedOperationException();        
    }

}

实现类添加了一个额外的方法setProducts()。接口ProductManager是否也不具有setProducts方法,以允许使用setProducts的类以多态方式实例化SimpleProductManager。目前这是不可能的 -

ProductManager p = new SimpleProductManager();
p.setProducts();

1 个答案:

答案 0 :(得分:7)

接口不包含setProducts,因为该接口的客户端(可能是MVC控制器)不应该调用它。该接口仅定义客户端应该使用的那些操作,而不是定义实现可能具有的所有方法。

bean配置可以访问setProducts方法(例如使用<property name="products">),这允许在启动时静态配置产品。之后,客户端代码通过其受限制的接口引用bean。

在此示例中永远不应调用您的p.setProducts()示例,因为产品仅在Bean配置中配置,而不是由业务逻辑配置。