【问题标题】:How to achieve static method from non-static interface method?如何从非静态接口方法实现静态方法?
【发布时间】:2020-06-16 20:20:35
【问题描述】:

我有一个这样的界面:

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

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

ClassName.fromBytes(...);

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

new ClassName().fromBytes();

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

【问题讨论】:

  • 您不能强制在实现中存在static 方法,但它为什么重要呢?当你想要ClassName 中的static fromBytes 方法时,无论如何你都必须在ClassName 中声明该方法,无论接口是否强制。对于执行ClassName.fromBytes(...);的调用者来说,接口是否声明方法没有区别。

标签: java interface abstract-class static-methods


【解决方案1】:

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

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

希望对你有帮助。

【讨论】:

  • Byteable&lt;YourClass,byte[]&gt; transformer = new Byteable&lt;&gt;(); 代替。
  • 是的,我猜它会删除一个警告,这表明 raw use of parameterized class 或者更好的是我们可以通过右侧两个中的 para。
【解决方案2】:

您正在尝试做的是一个抽象的静态方法,这在 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
    }
}

注意:

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

您可以在抽象类中拥有static 方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多