我是 Java 新手,来自 C 背景,我如何回答“数据抽象可以在 Java 中实现吗?”的问题.
以下是我想回答的问题,如有错误请指正。
SUSv3 引入了一种名为 pthread_t 的数据类型,但没有指定它的表示形式(如 ulong 或指向结构的指针等),并且必须被视为不透明数据。
想要处理 pthread_t 数据的用户必须通过像 pthread_equal() 这样的函数来使用它,在本例中是为了检查相等性。但 C 仍然无法阻止用户做类似 'tid == pthread_self();' 的事情尽管 pthread_t 是不透明数据,但在编译时。 运行时行为未知。
Java 作为语言功能的一部分,可以通过在类内的数据成员上引入私有(private)/ protected /包访问说明符并使用对这些数据成员执行相同逻辑的公共(public)成员函数来阻止用户在编译时执行此类操作。
最佳答案
听起来这是 generics 的一个用例- 它们可以提供编译时类型安全。更改修饰符的可见性或引入修饰符并不能解决此问题,因为它们本身在语法上可能是正确的,但无法提供编译时安全性。
以此为例:
public class ThreadData<T> {
private T data;
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
这个类ThreadData
是通用的,可以接受我想要的任何类型的数据。
这是示例用法 - 注释是内联提供的。
ThreadData<Integer> intThreadData = new ThreadData<>();
intThreadData.setData(10); // OK; this is type bound to Integer
intThreadData.setData("10"); // Not OK - will fail at compile time
关于java - 我对数据抽象定义的回答,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22110095/