通过扩展实现Java克隆
想象一下情况: 我有两节课通过扩展实现Java克隆,java,clone,cloning,Java,Clone,Cloning,想象一下情况: 我有两节课 public class Fruit{ } 以及: 我的程序有一个水果和一个水果销售对象。我想在果品销售的基础上创建全新的(克隆)果品2[水果](例如,有人购买了果品销售,它需要出现在他的包中,但作为一种普通水果,因为它不再在商店中)。在此过程中,方法getPrice和字段price被删除。 然后倒转过来——有人开了一家商店(…),把他的水果卖了。现在,我需要将水果转换为水果销售(我希望它作为“特价”放在商店里,作为“普通”放在我的包里,但作为独立的物品) 这些类将
public class Fruit{
}
以及:
我的程序有一个水果和一个水果销售对象。我想在果品销售的基础上创建全新的(克隆)果品2[水果](例如,有人购买了果品销售,它需要出现在他的包中,但作为一种普通水果,因为它不再在商店中)。在此过程中,方法getPrice和字段price被删除。
然后倒转过来——有人开了一家商店(…),把他的水果卖了。现在,我需要将水果转换为水果销售(我希望它作为“特价”放在商店里,作为“普通”放在我的包里,但作为独立的物品)
这些类将被重建、修改,并且可能需要对它们进行大量的工作,所以我不想仅仅通过复制每个字段来手动重写它们,因为这是毫无意义的。可以通过克隆吗?或者你有更好的想法吗?使用作文:
public class Fruit {
// your regular fruit class
}
您的“出售水果”:
现在,您可以通过传入一个Fruit
实例来构造FruitOnSale
实例,也可以从FruitOnSale
实例中获得一个Fruit
实例。请注意,当您使用Fruit
实例初始化FruitOnSale
实例时,它会创建Fruit
实例的“副本”。这样做很好,否则您可以修改原始的Fruit
实例,这将影响FruitOnSale
实例。这不是你想要的,如果你假设这些是不可变的。类似地,getFruit()
不返回对内部实例的引用,而是创建一个全新的Fruit
实例
虽然使用继承来解决这个特定的示例并不违反,但一般来说,考虑扩展基类的影响是一个好主意。例如,您可以使用水果
做一些事情,但对水果销售
没有意义(即,可能导致不一致、不合逻辑或不可预测的行为);这是违反LSP的一个例子。使用合成:
public class Fruit {
// your regular fruit class
}
您的“出售水果”:
现在,您可以通过传入一个Fruit
实例来构造FruitOnSale
实例,也可以从FruitOnSale
实例中获得一个Fruit
实例。请注意,当您使用Fruit
实例初始化FruitOnSale
实例时,它会创建Fruit
实例的“副本”。这样做很好,否则您可以修改原始的Fruit
实例,这将影响FruitOnSale
实例。这不是你想要的,如果你假设这些是不可变的。类似地,getFruit()
不返回对内部实例的引用,而是创建一个全新的Fruit
实例
虽然使用继承来解决这个特定的示例并不违反,但一般来说,考虑扩展基类的影响是一个好主意。例如,您可以使用水果
做一些事情,但对水果销售
没有意义(即,可能导致不一致、不合逻辑或不可预测的行为);这是违反LSP的一个例子。使用合成:
public class Fruit {
// your regular fruit class
}
您的“出售水果”:
现在,您可以通过传入一个Fruit
实例来构造FruitOnSale
实例,也可以从FruitOnSale
实例中获得一个Fruit
实例。请注意,当您使用Fruit
实例初始化FruitOnSale
实例时,它会创建Fruit
实例的“副本”。这样做很好,否则您可以修改原始的Fruit
实例,这将影响FruitOnSale
实例。这不是你想要的,如果你假设这些是不可变的。类似地,getFruit()
不返回对内部实例的引用,而是创建一个全新的Fruit
实例
虽然使用继承来解决这个特定的示例并不违反,但一般来说,考虑扩展基类的影响是一个好主意。例如,您可以使用水果
做一些事情,但对水果销售
没有意义(即,可能导致不一致、不合逻辑或不可预测的行为);这是违反LSP的一个例子。使用合成:
public class Fruit {
// your regular fruit class
}
您的“出售水果”:
现在,您可以通过传入一个Fruit
实例来构造FruitOnSale
实例,也可以从FruitOnSale
实例中获得一个Fruit
实例。请注意,当您使用Fruit
实例初始化FruitOnSale
实例时,它会创建Fruit
实例的“副本”。这样做很好,否则您可以修改原始的Fruit
实例,这将影响FruitOnSale
实例。这不是你想要的,如果你假设这些是不可变的。类似地,getFruit()
不返回对内部实例的引用,而是创建一个全新的Fruit
实例
虽然使用继承来解决这个特定的示例并不违反,但一般来说,考虑扩展基类的影响是一个好主意。例如,您可以使用
水果
做一些事情,但对水果销售
没有意义(即,可能导致不一致、不合逻辑或不可预测的行为);这将是违反LSP的一个例子。克隆和继承是两个非常不同且非常不相关的概念,如果我理解正确的话,这两个概念不太可能对您目前的情况有所帮助
克隆通常指何时要复制
public class WoodenChair extends WoodenFurniture{
public void sit(){
// Implementation here
}
}
public class Fruit{
private boolean onSale = false;
private int price = 0;
/**
* Retrieves the price of the fruit if it is on sale.
*/
public int getPrice(){
// Check if the fruit is in the onSale state
if(!onSale){
// Rather than throwing exception, you can alternatively return an invalid price e.g. -1 to denote "not for sale"
throw new IllegalStateException("not on sale");
}
return price;
}
public void putOnSale(int price){
this.price = price;
onSale = true;
}
public void takeOffSale(){
onSale = false;
}
}