封装所有原语的Java对象——在OutputStreams中很有用

封装所有原语的Java对象——在OutputStreams中很有用,java,class,standards,abstract-class,primitive,Java,Class,Standards,Abstract Class,Primitive,我有一个接收二进制数据的程序,根据它的标题,它表示一个浮点值,int,双精度,字符,字符串,等等 在程序中,我使用ByteBuffer类获取byte[],然后使用getFloat()或getInt()等方法将内容提取为可用形式 我想有效地将值从getFloat()或getInt()传递到System.out.println(),而不使用开关或if/else语句 由于println()可以接受Float、Int或任何东西,因此如果有一个Java对象,我可以使用它将getXXX()数据填充到其中,而

我有一个接收二进制数据的程序,根据它的标题,它表示一个
浮点值
int
双精度
字符
字符串
,等等

在程序中,我使用
ByteBuffer
类获取
byte[]
,然后使用
getFloat()
getInt()
等方法将内容提取为可用形式

我想有效地将值从
getFloat()
getInt()
传递到
System.out.println()
,而不使用开关或if/else语句

由于
println()
可以接受
Float
Int
或任何东西,因此如果有一个Java对象,我可以使用它将
getXXX()
数据填充到其中,而不考虑类型,然后将值返回到
println()
函数中,那就太好了

唯一的问题是,我不知道有哪个Java类能做到这一点,而且我的谷歌搜索也很枯燥。有人知道一门课吗

我想我可以写一个,但我试着先用Java认证的方式做每件事

编辑:以下是我当前代码的示例:

ByteBuffer buffer = ByteBuffer.wrap(dat.message);

if (dat.dataType.equalsIgnoreCase("float")) {

    System.out.println("Message: " + buffer.getFloat());

} else if (dat.dataType.equalsIgnoreCase("int")) {

    System.out.println("Message: " + buffer.getInt());

} else if (dat.dataType.equalsIgnoreCase("char")) {

    System.out.println("Message: " + buffer.getChar());

} else if (dat.dataType.equalsIgnoreCase("long")) {

    System.out.println("Message: " + buffer.getLong());

} else if (dat.dataType.equalsIgnoreCase("boolean")) {

    System.out.println("Message: " + buffer.get());

} else if (dat.dataType.equalsIgnoreCase("string")) {

    String str = new String(dat.message);
    System.out.println("Message: " + str);

}
对我来说太难看了,一定有更好的方式使用Java

ByteBuffer buffer = ByteBuffer.wrap(dat.message);
System.out.println("Message: " + buffer);
Java中的所有对象都是从对象继承的某个类的实例。由于
println
接受
Object
s,因此您不必担心要传递的类型


编辑:能否为
dat
提供声明

public Object getValue(Dat dat) {
    ByteBuffer buffer = ByteBuffer.wrap(dat.message);

    if (dat.dataType.equalsIgnoreCase("float")) {
        return buffer.getFloat();
    } else if (dat.dataType.equalsIgnoreCase("int")) {
        return buffer.getInt();
    } else if (dat.dataType.equalsIgnoreCase("char")) {
        return buffer.getChar();
    } else if (dat.dataType.equalsIgnoreCase("long")) {
        return buffer.getLong();
    } else if (dat.dataType.equalsIgnoreCase("boolean")) {
        return buffer.get() != 0;
    } else if (dat.dataType.equalsIgnoreCase("string")) {
        return new String(dat.message);
    }
}

// ...

System.out.println("Message: " + getValue(dat));
Java中的所有对象都是从对象继承的某个类的实例。由于
println
接受
Object
s,因此您不必担心要传递的类型


编辑:能否为
dat
提供声明

public Object getValue(Dat dat) {
    ByteBuffer buffer = ByteBuffer.wrap(dat.message);

    if (dat.dataType.equalsIgnoreCase("float")) {
        return buffer.getFloat();
    } else if (dat.dataType.equalsIgnoreCase("int")) {
        return buffer.getInt();
    } else if (dat.dataType.equalsIgnoreCase("char")) {
        return buffer.getChar();
    } else if (dat.dataType.equalsIgnoreCase("long")) {
        return buffer.getLong();
    } else if (dat.dataType.equalsIgnoreCase("boolean")) {
        return buffer.get() != 0;
    } else if (dat.dataType.equalsIgnoreCase("string")) {
        return new String(dat.message);
    }
}

// ...

System.out.println("Message: " + getValue(dat));
float
将自动装箱到
float
中,这是一个
对象

int
将被自动装箱为
整数
,该整数是
对象

等等

float
将自动装箱到
float
中,这是一个
对象

int
将被自动装箱为
整数
,该整数是
对象



等等。

为什么不使用对象类?也许我应该。。。我注意到这是ByteBuffer中的一个方法:这里可能有访客模式的例子。但是很难判断
dat
对象的实际用途是什么,因为它似乎只保存字节数据和表示类型的字符串。就像您可以非常简单地将数据转换为应用程序中更高级别的盒装类型一样。或为允许的混凝土类型创建子类。那么你甚至不需要访问者,只需要一个适当的
toString
实现。。。我注意到这是ByteBuffer中的一个方法:这里可能有访客模式的例子。但是很难判断
dat
对象的实际用途是什么,因为它似乎只保存字节数据和表示类型的字符串。就像您可以非常简单地将数据转换为应用程序中更高级别的盒装类型一样。或为允许的混凝土类型创建子类。那么你甚至不需要访问者,只需要一个
toString
的正确实现。真的吗?这就是全部。。所以getXXX()方法是多余的?我收回这一点,它不起作用。。。。我不小心把getFloat()放在那里了。。。这就是当我没有指定getXXX()消息时弹出的消息:java.nio.HeapByteBuffer[pos=0 lim=4 cap=4]dat是我自己的类,它只保存一组数据。这就是全部。它有短路、浮点、整数、字符串等@EricS是的,我忘了缓冲区不能自动转换为正确的数据类型。你可以通过反射使你的解决方案变得更短,但这对于你的目的来说可能有点过头了。是的,学习更多关于反射的知识在我的Java技能列表中很重要?这就是全部。。所以getXXX()方法是多余的?我收回这一点,它不起作用。。。。我不小心把getFloat()放在那里了。。。这就是当我没有指定getXXX()消息时弹出的消息:java.nio.HeapByteBuffer[pos=0 lim=4 cap=4]dat是我自己的类,它只保存一组数据。这就是全部。它有短路、浮点、整数、字符串等@EricS是的,我忘了缓冲区不能自动转换为正确的数据类型。你可以通过反射使你的解决方案变得更短,但这对于你的目的来说可能有点过头了。是的,学习更多关于反射的知识在我的Java技能清单中很重要,尽管它与我最初的解决方案非常相似,它确实可以让我在代码的其他地方创建一个静态方法,而不会阻塞我的算法方法。使用
enum
,您可以更灵活地实现相同的功能。很酷,尽管它与我最初的解决方案非常相似,它确实允许我在代码的其他地方创建一个静态方法,而不会阻塞我的算法方法。使用
enum
可以更灵活地实现相同的功能。