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

时间:2020-06-16 20:20:35

标签: java interface abstract-class static-methods

我有一个这样的界面:

public interface Byteable<T> {
    byte[] toBytes();
    T fromBytes(byte[] bytes);
}
顾名思义,

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

ClassName.fromBytes(...);

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

是一种好习惯吗?
new ClassName().fromBytes();

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

2 个答案:

答案 0 :(得分:2)

您可以创建一个抽象类,该抽象类将两个方法都包含为抽象方法,并在所需的类中扩展该抽象类。

    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 
     }
   }

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

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

您可以对任何所需的类执行相同的操作,只需实现类或为类提供功能即可执行这些任务。

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

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(....);

希望对您有所帮助。

答案 1 :(得分:1)

您要尝试的是一个抽象的静态方法,Java不允许这样做。选中this

除了这个问题,您还可以尝试这种方式。

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 } } 。这样的例子。

static

注意:

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

您可以在抽象类中使用{{1}}个方法。