java – 在使用层次结构参数的操作中避免静态绑定
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 在使用层次结构参数的操作中避免静态绑定,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2938字,纯文字阅读大概需要5分钟。
内容图文
![java – 在使用层次结构参数的操作中避免静态绑定](/upload/InfoBanner/zyjiaocheng/699/53ed0c9b391b44689dd1e9ac39bc5743.jpg)
我发现了一个关于静态绑定的问题.
我真正的课程非常扩展,所以我会用几个玩具类来表达我的问题.
我们假设我们有以下层次结构.
public class Element{}
public class Element1 extends Element{}
public class Element2 extends Element{}
我有一个Stock类,它使用Element层次结构定义的不同Element专门化.
public class Stock{
public void operation(Element1 e1){
System.out.println("Operation - " + e1.getClass().getName());
}
public void operation(Element2 e2){
System.out.println("Operation - " + e2.getClass().getName());
}
}
最后,我有一个StockManager,允许管理股票.
public StockManager{
Stock stock;
public StockManager(Stock stock){
this.stock=stock;
}
public void manage(List<Element> elements){
for(Element element: elements){
stock.operation(element);
}
}
}
当然,此代码无法编译,因为Stock没有定义包含Element作为参数的方法.在这种情况下,我们可以使用不同的方法修复代码.
首先,我将能够定义一个方法,该方法将Element定义为输入arg,例如
public void operation(Element e){
System.out.println("Operation - " + e.getClass().getName());
}
该方法可以定义用于管理不同具体元素(Element1,Element2)的开关.然而,这对我来说是不可能的,因为开关违反了Open/Close Principle,而且我有很多(很多)具体元素.
另一种选择,我可以使用像Visitor Pattern这样的东西.
我可以将Stock对象发送到具体元素.具体要素将由Stock操作负责.所以,课程可以改为:
public abstract class Element{
public abstract void stockOperation(Stock stock);
}
public class Element1 extends Element{
public abstract void stockOperation(Stock stock){
stock.operation(this);
}
}
public class Element2 extends Element{
public abstract void stockOperation(Stock stock){
stock.operation(this);
}
}
和StockManager.
public StockManager{
Stock stock;
public StockManager(Stock stock){
this.stock=stock;
}
public void manage(List<Element> elements){
for(Element element: elements){
element.stockOperation(stock);
}
}
}
它允许在编译时确定具体元素的静态类型.并且动态绑定将调用正确的具体元素(Element1或Element2)的stockOperation方法.但是,我在具体元素中有重复的代码,我将有几个具体的元素.
所以,我想知道我们是否知道任何模式设计或任何解决此问题的最佳实践.
(另一种选择,它可能使用反射,但我不喜欢使用它).
解决方法:
问题是您将单个库存操作放在库存对象中.无论您是否使用开关,只要您有另一个元素类型,您就需要通过向其添加新的重载操作来修改库存.正如您所说,您的Stock类应该关闭以进行修改.
因此,您必须将任何库存操作转移到Element对象本身.这基本上是您的第二个建议,但您可以在每个不同的元素中执行.
public abstract class Element{
public abstract void stockOperation(Stock stock);
}
public class Element1 extends Element{
@Override
public void stockOperation(Stock stock){
System.out.println("Operation - Element1");
}
}
public class Element2 extends Element{
@Override
public void stockOperation(Stock stock){
System.out.println("Operation - Element2");
}
}
您可能需要与库存对象进行通信以进行实际操作.使用传递给每个stockOperation的库存来执行此操作,使方法可用,允许元素获取或设置库存对象内所需的任何内容,例如操作的结果.
这样,如果您有一个新的Element类型,您只需要在新元素中编写新操作,并且可以保留相同的Stock类而不更改它.这是扩展而不是修改.
内容总结
以上是互联网集市为您收集整理的java – 在使用层次结构参数的操作中避免静态绑定全部内容,希望文章能够帮你解决java – 在使用层次结构参数的操作中避免静态绑定所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。