如何从非静态接口方法实现静态方法?

How to achieve static method from non-static interface method?

我有这样的界面:

public interface Byteable<T> {
    byte[] toBytes();
    T fromBytes(byte[] bytes);
}

顾名思义,它将对象转换为字节模式,并可以从给定的字节数组重新创建对象(如果不是,则抛出某种异常)。 我喜欢 toBytes() 方法,它必须是非静态的,因为它只能应用于对象。但是我怎样才能创建一个静态方法以便我可以调用

ClassName.fromBytes(...);

我如何确保每个实现该接口的 class 都具有这两个功能,或者我如何创建一个使用非静态 fromBytes(...) 的静态方法?创建默认构造函数并执行类似

的操作是好习惯吗
new ClassName().fromBytes();

有什么好的做法吗?我想抽象 class 也不是解决方案,因为它不能有静态方法,可以吗?

您可以创建一个摘要 class,它将包含您的两个方法作为摘要,并且您将在您想要的 class.

中扩展该摘要 class
    public abstract class Byteable<T> {
      abstract byte[] toBytes();
      abstract T fromBytes(byte[] bytes); 
    }

   public YourClass extends Byteable<YourClass>{
     //provide implementation for abstract methods
     public byte[] toBytes(){
        //write your conversion code 
     }
     public YourClass fromBytes(byte[] bytes){
        //write your conversion code 
     }
   }

现在您可以创建 class 的对象并使用这两种方法。

YourClass obj = new YourClass();
obj.toBytes()
obj.fromBytes(....)

您可以对任何想要的 class 执行相同的操作,只需实施或向 class 提供功能即可执行这些任务。

除此之外,您可以编写一个通用转换 class :

public class Byteable<I,O> {
  O toBytes(I obj){
    // Your transformation code
  }
  T fromBytes(O bytes){
    // Your implementation
  } 
}

Byteable<YourClass,byte[]> transformer = new Byteable<YourClass,byte[]>(); 
transformer.toBytes(new YourClass())
transformer.fromBytes(....);

希望对你有所帮助

您尝试做的是抽象静态方法,Java 不允许这样做。检查 this.

除了这个问题你还可以试试这个

public interface Byteable<T> {
    byte[] toBytes();
    Builder<T> builder();

    interface Builder<T> {
        T fromBytes(byte[] bytes);
    }
}

在这种情况下,您需要实施两个 interface。一个例子是这样的。

public class Student implements Byteable<Student> {
    public final String name;

    public Student(String name) {
        this.name = name;
    }

    @Override
    public byte[] toBytes() {
        return name.getBytes();
    }

    @Override
    public Builder<Student> builder() {
        return bytes -> new Student(new String(bytes));
    }

    public static void main(String[] args) {
        Student s1 = new Student("Ana");
        Builder<Student> builder = s1.builder();
        byte[] bytes = s1.toBytes();
        Student s2 = builder.fromBytes(bytes);

        System.out.println(s2.name);    // Outputs Ana
    }
}

注:

Is there any good practice? I guess an abstract class isn't a solution either, because it can not have static methods, can it?

您可以在摘要中包含 static 个方法 class。