关于代码段的类设计注意事项

时间:2013-09-04 19:35:39

标签: java

关于以下代码段,为什么方法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;
   }
 }

5 个答案:

答案 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。它有一个返回类型,因为它返回它创建的对象。它是静态的,因为非静态工厂方法没有多大意义(如何在尚未创建的对象上调用方法?)