关于以下代码段,为什么方法read
的定义具有MyWritable
,而其他两种方法write
和readFields
没有?此外,为什么read
应该定义为静态?如何理解这种设计?
public class MyWritable implements Writable {
// Some data
private int counter;
private long timestamp;
public void write(DataOutput out) throws IOException {
out.writeInt(counter);
out.writeLong(timestamp);
}
public void readFields(DataInput in) throws IOException {
counter = in.readInt();
timestamp = in.readLong();
}
public static MyWritable read(DataInput in) throws IOException {
MyWritable w = new MyWritable();
w.readFields(in);
return w;
}
}
答案 0 :(得分:1)
答案很简单。
static
read方法允许您在实际类上调用该方法并返回实例。所以,而不是做:
MyWritable writer = new MyWritable();
writer.readFields(input);
你可以这样做:
MyWritable writer = MyWritable.read(input);
并达到同样的效果。这是为了方便。
然后,它返回MyWritable
,否则你永远不会得到这个对象!第一种方法可以返回void
,因为你已经创建了一个对象实例,但在后者中,它必须返回它为你创建的实例。
答案 1 :(得分:1)
此设计实现了一个非常简单的factory method pattern:用户会调用read
,而不是调用new MyWritable()
,然后调用readFields()
。
要完成工厂方法模式实现,请创建构造函数private
,并通过接口返回构造的对象:
private MyWritable() {} // Disallow external instantiations
// Use the Writable interface rather than MyWritable as the return type
public static Writable read(DataInput in) throws IOException {
MyWritable w = new MyWritable();
w.readFields(in);
return w;
}
答案 2 :(得分:0)
实际上,看起来他们似乎正在尝试创建一个简单的入口点来读取这些项目,而不是“新建”未知可写。所以: MyWritable.read(DataInput中);
在MyWritable的内存中创建一个实例(让我们称之为myWritable1)。然后他们调用'myWritable1.readFields'并允许它'自己'读'和'填充'。
MyWritable.read(dataInput)将返回myWritable1(在上面创建)。
静态读取方法完全没必要,甚至可能不是一个好主意。它使它易于使用,但它并没有真正节省太多的工作。 新的MyWritable()。readFields(dataInput)也可以正常工作。
答案 3 :(得分:0)
MyWritable
,所以你可以在看完之后用它做一些事情,就像查看数据一样。 答案 4 :(得分:0)
在这种情况下,read(DataInput)
方法是一种工厂方法,可根据某些数据创建MyWritable
。它有一个返回类型,因为它返回它创建的对象。它是静态的,因为非静态工厂方法没有多大意义(如何在尚未创建的对象上调用方法?)