Как получить метод stati c из метода интерфейса non-stati c? - PullRequest
1 голос
/ 16 июня 2020

У меня есть такой интерфейс:

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

который, как следует из названия, преобразует объект в байтовый шаблон и может воссоздать объект из заданного байтового массива (или бросить какой-то исключение, если нет). Мне нравится метод toBytes (), и он должен быть нестатическим c, потому что его можно применять только к объектам. Но как я могу создать метод stati c, чтобы я мог вызывать

ClassName.fromBytes(...);

Как я могу гарантировать, что каждый класс, реализующий интерфейс, имеет обе эти функции, или как я могу создать stati c метод, использующий нестандартные c fromBytes(...)? Является ли хорошей практикой создание конструктора по умолчанию и выполнение чего-то вроде

new ClassName().fromBytes();

Есть ли какая-нибудь хорошая практика? Думаю, абстрактный класс тоже не является решением, потому что у него не может быть методов stati c, не так ли?

Ответы [ 2 ]

2 голосов
/ 16 июня 2020

вы можете создать абстрактный класс, который будет содержать оба ваших метода как абстрактный, и вы расширите этот абстрактный класс в желаемый класс.

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

И вы можете сделать то же самое с любым желаемым классом, который просто должен реализовать или предоставить классу функциональность для выполнения этих задач.

Помимо этого, вы можете написать один общий c класс преобразования:

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 голос
/ 16 июня 2020

То, что вы пытаетесь сделать, - это абстрактный метод c stati, который не разрешен в 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
    }
}

Примечание:

Есть ли какие-нибудь хорошие практики? Думаю, абстрактный класс тоже не является решением, потому что он не может иметь методов c, не так ли?

Вы можете иметь static методов в абстрактном классе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...