有一个与在Java类中创建对象列表有关的问题。
谁能告诉我哪种解决方案更好?利弊吗?
1)我的第一堂课:
public class ProductRepositoryImpl implements ProductRepository {
private List<Product> listOfProducts = new ArrayList<Product>();
public ProductRepositoryImpl() {
addProducts(1, "Silnik", "Ferrari", 1000, listOfProducts);
addProducts(2, "Sprzęgło", "Opel", 500, listOfProducts);
addProducts(3, "Kierownica", "Fiat", 100, listOfProducts);
addProducts(4, "Panewka", "Maluch", 250.00, listOfProducts);
addProducts(5, "Akumulator", "Autosan", 1700.00, listOfProducts);
addProducts(6, "Zakrętka", "Maseratii", 100.00, listOfProducts);
}
private void addProducts(int idProduct, String name, String brand, double price, List list) {
Product product = new Product();
product.setId(idProduct);
product.setName(name);
product.setBrand(brand);
product.setPrice(price);
list.add(product);
}
@Override
public List<Product> getListOfProducts() {
return listOfProducts;
}
}
2)第二个:
public class ProductRepositoryImpl implements ProductRepository {
private List<Product> listOfProducts = new ArrayList<Product>();
public ProductRepositoryImpl() {
Product p1 = new Product();
p1.setId(1);
p1.setName("Silnik");
p1.setBrand("Ferrari");
p1.setPrice(1000);
Product p2 = new Product();
p2.setId(2);
p2.setName("Hamulec");
p2.setBrand("Opel");
p2.setPrice(500);
Product p3 = new Product();
p3.setId(3);
p3.setName("Kierownica");
p3.setBrand("Fiat");
p3.setPrice(100);
Product p4 = new Product();
p4.setId(4);
p4.setName("Akumulator");
p4.setBrand("Autosan");
p4.setPrice(1700);
Product p5 = new Product();
p5.setId(5);
p5.setName("Zakrętka");
p5.setBrand("Maseratii");
p5.setPrice(100);
listOfProducts.add(p1);
listOfProducts.add(p2);
listOfProducts.add(p3);
listOfProducts.add(p4);
listOfProducts.add(p5);
}
@Override
public List<Product> getListOfProducts() {
return listOfProducts;
}
}
每次解释我都将不胜感激。
最佳答案
有一些设计指南可以帮助您改善代码:
职责分离。 ProductRepositoryImpl应该负责处理产品的存储库。这不是它的责任,也不应该具有构造产品的代码。产品的构造应由产品负责
代码重用。版本1优于版本2,因为用于构造产品的代码在addProducts()
内编写一次,而不是在版本2中多次编写。
封装。类的接口是唯一应该公开的部分。它的实现应该被隐藏。这意味着不应直接从外部访问产品的id字段,而应通过接口方法访问。优点是,如果以后需要更改id的内部工作方式,则可以轻松完成此操作,因为所有id都来自Product类中的一些方法。如果id字段是公开的,那么可能会有数百个地方访问它,而处理这种更改将是一场噩梦。
另一个问题是可变性。 setName方法暗示您的Product类是可变的。如果那是您的应用程序的绝对要求,请继续。但是,如果产品一旦定义就没有变化,则应该使Product不变。不变性具有几个优点,其中之一是不需要同步就可以保证线程安全。因此,我已经使产品保持不变。
考虑到这些指导原则,这就是我要采取的方法:
class Product
{
private final int idProduct;
private final String name;
private final String brand;
private final double price;
public Product(int idProduct, String name, String brand, double price)
{
this.idProduct = idProduct;
this.name = name;
this.brand = brand;
this.price = price;
}
}
public class ProductRepositoryImpl implements ProductRepository
{
private List<Product> listOfProducts = new ArrayList<Product>();
public ProductRepositoryImpl()
{
addProduct(new Product(1, "Silnik", "Ferrari", 1000));
addProduct(new Product(2, "Sprzęgło", "Opel", 500));
addProduct(new Product(3, "Kierownica", "Fiat", 100));
addProduct(new Product(4, "Panewka", "Maluch", 250.00));
addProduct(new Product(5, "Akumulator", "Autosan", 1700.00));
addProduct(new Product(6, "Zakrętka", "Maseratii", 100.00));
}
private void addProduct(Product product)
{
listOfProducts.add(product);
}
@Override
public List<Product> getListOfProducts()
{
return listOfProducts;
}
}