【问题标题】:My flavour of answer to Definition of Data abstraction我对数据抽象定义的回答
【发布时间】:2014-03-01 04:26:29
【问题描述】:

我是 Java 新手,来自 C 背景,我该如何回答“数据抽象可以在 Java 中实现吗?”这个问题。 .

以下是我想回答的问题,如果我的想法有误,请纠正我。

SUSv3 引入了一种名为 pthread_t 的数据类型,但没有指定它的表示形式(如 ulong 或指向结构的指针等),并且必须将其视为不透明数据。

想要处理 pthread_t 数据的用户必须通过诸如 pthread_equal() 之类的函数来使用它,在这种情况下检查是否相等。但是 C 仍然不能阻止用户执行类似 'tid == pthread_self();' 之类的操作尽管 pthread_t 是不透明数据,但在编译时。 运行时行为未知。

Java 作为语言功能的一部分,可以通过在类中的数据成员上引入私有/受保护/包访问说明符并使用对这些数据成员执行相同逻辑的公共成员函数来阻止用户在编译时执行此类操作。

【问题讨论】:

    标签: java c unix pthreads


    【解决方案1】:

    听起来这是generics 的一个用例——它们可以提供编译时类型安全。更改修饰符的可见性或引入修饰符并不能解决这个问题,因为它们本身可能在语法上是正确的,但不会提供编译时安全性。

    以此为例:

    public class ThreadData<T> {
        private T data;
    
        public T getData() {
            return data;
        }
    
        public void setData(T data) {
            this.data = data;
        }
    }
    

    这个类ThreadData 是通用的,可以接受我想要的任何类型的数据。

    这是示例用法 - 内联提供了 cmets。

    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
    

    【讨论】:

    • 是的,我认为我们正在避免类型不安全的问题。但在此之前,您是否认为,我们通过让用户不打扰其表示并仅依赖公共功能来阻止用户直接访问数据?
    • 嗯,不。通过反思,我可以在这门课上做任何我想做的事情;如果我愿意,我可以忽略你所有的可见性和范围保护。所以不,这对编译时安全没有帮助。
    • 让我们暂时删除 并考虑一个简单的类 ThreadData,我发现我无法比较说 data1==data2,因为数据是私有的,如果它是公共的,我可以做到了。
    • 你不想那样做(我认为你跑题了)。您想覆盖 equals 来检查等价性。如果你想比较,那么你应该实现Comparable&lt;T&gt;并实现一个合适的compareTo方法。
    • 哦,您可以使用反射忽略所有范围保护吗?我不知道反射是什么?但是我们可以忽略范围保护吗?有点奇怪):
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多