关于以下代码段,为什么方法read的定义中有一个MyWritable,而其他两个方法writereadFields没有?此外,为什么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;
   }
 }

最佳答案

答案很简单。

static读取方法允许您在实际的类上调用该方法并返回一个实例。因此,与其做:

MyWritable writer = new MyWritable();
writer.readFields(input);


您可以这样做:

MyWritable writer = MyWritable.read(input);


并达到相同的效果。为了方便。

然后,它返回MyWritable,因为否则您将永远无法获得对象!第一个方法可以返回void,因为您已经创建了对象实例,但是在后一个方法中,它必须返回为您创建的实例。

10-08 16:14