如何从非静态接口方法实现静态方法?
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。
我有这样的界面:
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。