java空对象_Java中的空对象模式

阅读: 评论:0

java空对象_Java中的空对象模式
今天,我正在讨论⼀种较少使⽤的模式,称为空对象模式。在⾯向对象的编程中,我们经常处理空对象。空对象是指没有任何引⽤的对象或使⽤中性/空功能/⾏为定义的对象。在访问任何成员或调⽤任何⽅法时,需要检查这些空对象以确保它们不为空。这是因为成员或⽅法通常⽆法在空对象上调⽤。
空对象模式
空对象设计模式描述了空对象的⽤法及其在系统中的⾏为。
·
空对象模式处理空对象。
⽽不是检查null对象,我们定义了null⾏为或调⽤了do-nothing⾏为。
这些空对象还可以⽤于在数据不可⽤的情况下提供默认⾏为。
这种⽅法优于有效的默认实现的优势在于,空对象⾮常容易预测,并且没有副作⽤-它 什么也不做。
如果资源不可⽤于测试,则空对象模式还可以⽤作测试的存根。
在使⽤空对象模式之前,我们应该了解:
该模式应谨慎使⽤。它可以使错误显⽰为正常程序执⾏。
我们不应该仅仅为了避免空检查⽽使代码更具可读性就实现这种模式。实际上,很难读取移⾄另⼀个位置的代码,例如null对象类。
我们必须执⾏其他测试以确保没有地⽅要分配null⽽不是null对象。
让我们看⼀个例⼦,以更好地理解这种模式。
空对象的⽰例
创建⼀个抽象类(或接⼝)以指定各种功能。我在本⽰例中使⽤shape接⼝。请注意,我也在isNull() 界⾯中创建了⼀个⽅法 。有⼀个⽅法很好,⽽且我喜欢它,因为我可以更好地识别和控制空定义的对象。
false 对于所有的具体类,此⽅法将返回 。并且,它将true 仅针对空对象类返回 。
package design.nullobject;
public interface Shape {
double area();
double perimeter();
void draw();
// nice to have method to indicate null object
boolean isNull();
}
您将需要创建⼀个扩展该类或实现该接⼝的具体类。每个具体的类都将定义功能的特定版本。我定义三种形状: Circle , Rectangle ,和Triangle。这些具体的类将定义不同类型的形状。下⾯是Circle 该类的代码 :
public class Circle implements Shape {
// sides
private final double radius;
public Circle() {
this(1.0d);
}
public Circle(double radius) {
this.radius = radius;
}
@Override public double area() {
// Area = π r^2
return Math.PI * Math.pow(radius, 2);
@Override public double perimeter() {
// Perimeter = 2πr
return 2 * Math.PI * radius;
@Override public void draw() {
System.out.println("Drawing Circle with area: " + area() + " and perimeter: " + perimeter());
@Override
public boolean isNull() {
return false;
下⾯是Rectangle 该类的代码 :
public class Rectangle implements Shape {
/
/ sides
private final double width;
private final double length;
public Rectangle() {
this(1.0d ,1.0d);
public Rectangle(double width, double length) {
链轮设计
this.width = width;
this.length = length;
public double area() {
return width * length;
public double perimeter() {
/
/ P = 2(w + l)
return 2 * (width + length);
@Override
public void draw() {
System.out.println("Drawing Rectangle with area: " + area() + " and perimeter: " + perimeter());
放线架下⾯是Triangle 该类的代码 :
public class Triangle implements Shape {
// sides
private final double a;
private final double b;
private final double c;
六氢邻苯二甲酸酐
public Triangle() {
this(1.0d, 1.0d, 1.0d);
public Triangle(double a, double b, double c) {
this.a = a;
this.b = b;
this.c = c;
// Using Heron's formula:
// Area = SquareRoot(s * (s - a) * (s - b) * (s - c))
// where s = (a + b + c) / 2, or 1/2 of the perimeter of the triangle
double s = (a + b + c) / 2;
return Math.sqrt(s * (s - a) * (s - b) * (s - c));
/
/ P = a + b + c
return a + b + c;
System.out.println("Drawing Triangle with area: " + area() + " and perimeter: " + perimeter());
剥线现在,最重要的步骤是创建⼀个空对象类,该对象类扩展了抽象类或接⼝并定义了“不执⾏操作”⾏为。万⼀数据不可⽤,“不执⾏任何操作”⾏为就像默认⾏为。
public class NullShape implements Shape {
// no sides
return 0.0d;
System.out.println("Null object can't be draw");
现在,我们定义 Factory 该类以创建各种类型的形状。请参阅(Java中的策略vs⼯⼚设计模式)以了解⼯⼚模式。我ShapeFactory 为此⽰例创建 类。
public class ShapeFactory {
public static Shape createShape(String shapeType) {
Shape shape = null;
if ("Circle".equalsIgnoreCase(shapeType)) {
shape = new Circle();
} else if ("Rectangle".equalsIgnoreCase(shapeType)) {
shape = new Rectangle();
} else if ("Triangle".equalsIgnoreCase(shapeType)) {
shape = new Triangle();
} else {
shape = new NullShape();
return shape;
为了使⽰例简单,我没有在ShapeFactory ⽅法中收到形状边的参数 。因此,⼯⼚正在创建Shape 具有固定边值的其他 对象。
并且,在最后⼀步,创建⼀个 Main 类来执⾏和测试代码:
import design.nullobject.ShapeFactory;
public class ShapeMain {
public static void main(String[] args) {
String[] shapeTypes = new String[] { "Circle", null, "Triangle", "Pentagon", "Rectangle", "Trapezoid"};
for (String shapeType : shapeTypes) {
Shape shape = ateShape(shapeType);
// no null-check required since shape factory always creates shape objects
System.out.println("Shape area: " + shape.area());
System.out.println("Shape Perimeter: " + shape.perimeter());
shape.draw();
System.out.println();
}
下⾯是代码的输出:
Shape area: 3.141592653589793
lc谐振放大器
Shape Perimeter: 6.283185307179586
Drawing Circle with area: 3.141592653589793 and perimeter: 6.283185307179586
Shape area: 0.0
路径规划Null object can't be draw
Shape area: 0.4330127018922193
Shape Perimeter: 3.0
Drawing Triangle with area: 0.4330127018922193 and perimeter: 3.0
Shape area: 1.0
Shape Perimeter: 4.0
Drawing Rectangle with area: 1.0 and perimeter: 4.0
在Java 8中,我们具有 java.util.Optional 处理空引⽤的类。此类最初来⾃Guava API。
最后,开发这么多年我也总结了⼀套学习Java的资料与⾯试题,如果你在技术上⾯想提升⾃⼰的话,可以关注我,私信发送领取资料或者在评论区留下⾃⼰的联系⽅式,有时间记得帮我点下转发让跟多的⼈看到哦。

本文发布于:2023-05-16 21:59:26,感谢您对本站的认可!

本文链接:https://patent.en369.cn/patent/4/102456.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:对象   模式   定义   资料   实现   形状   代码   创建
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 369专利查询检索平台 豫ICP备2021025688号-20 网站地图