【问题标题】:Most idiomatic way of making a data structure on Java [closed]在 Java 上创建数据结构的最惯用方法 [关闭]
【发布时间】:2019-09-03 12:34:40
【问题描述】:

我正在 Java 上创建一个 Card 类,我希望它尽可能地地道。我是否应该封装所有字段,使其成为私有并提供如下获取器:

    public class Card implements Comparable<Card> {
        private char suit;
        private String name;
        private int value;

        public Card(char suit, String name, int value) {
            this.suit = suit;
            this.name = name;
            this.value = value;
        }

        public char getSuit() {
            return suit;
        }

        public String getName() {
            return name;
        }

        public int getValue() {
            return value;
        }


        public String toString() {
            return name + " of " + suit;
        }

        @Override
        public int compareTo(Card card) {
            return Integer.compare(value, card.value);
        }

    }

或者由于任何字段都不会被修改,所以应该公开所有字段:

    public class Card implements Comparable<Card> {
        public final char suit;
        public final String name;
        public final int value;

        public Card(char suit, String name, int value) {
            this.suit = suit;
            this.name = name;
            this.value = value;
        }

        public String toString() {
            return name + " of " + suit;
        }

        @Override
        public int compareTo(Card card) {
            return Integer.compare(value, card.value);
        }

    }

我正在阅读“数据结构与 OO 类”一章的 Clean Code,但我不知道在这种情况下应该采取什么方法。提前致谢!

编辑: 这个类是我正在开发的 BlackJack 的一部分,我需要访问其他类的字段。

编辑: 这个问题已经被搁置了,但是,这个问题应该在哪里发布呢?我应该把它移到代码审查吗?我真的很想了解更有经验的程序员对此主题的意见,但我想将其发布在正确的网站上

【问题讨论】:

  • 我会把它们都设为私有和最终的,并给每个人一个吸气剂。
  • 如果不能修改它们,将它们公开 final 真的没有意义吗?那将不必要地将他们暴露在课堂之外。
  • @Nexevis 这个类是我正在开发的 BlackJack 的一部分,我需要访问其他类的字段
  • @Davichete 但是将它们设为公开允许它们访问以进行修改阅读,将它们设为私有的要点之一是您可以取消set 的特权如果你愿意,他们只留下get。使用公共字段,您无法删除 set
  • 是的,public final 字段不会是可变的。虽然请注意,仅适用于参考;它不会阻止存储在字段中的可变对象发生突变。但同样,根据我的经验,使用 getter/setter 是 Java 中惯用的做事方式。

标签: java oop data-structures


【解决方案1】:

理论上,当您设计 OOP 解决方案时,您必须提供least priviledge wherever possible. 因此,您的第一种方法是可行的。但是,我会 rather implement hashCode() 更清楚地了解卡片的独特性。

您尝试实现的内容称为immutable objects

【讨论】:

  • 但是,我在 public final 字段中赋予了我没有使用 getter 赋予的什么特权?它暴露了相同的信息,不是吗?我能看到的唯一区别是可读性和性能,使其公开 final 比 getter 更快。如果我遗漏了什么,请纠正我
  • 您不应该创建public final,因为它使属性在整个应用程序中都可用。因为封装是 OOP 的关键原则之一。如果您严格要确保不修改属性,只需将您的 Card 实现为 不可变 对象。 https://docs.oracle.com/javase/tutorial/essential/concurrency/immutable.html
  • 所有字段 final 的类不是不可变的吗?你不能修改任何东西。整个应用程序也可以使用公共 getter,它提供与 public final 字段相同的信息。两种方式都使属性不可修改。我仍然认为一种或另一种方式之间没有区别
  • 我不会偷他的答案:stackoverflow.com/a/34087790/4506140我希望现在你能理解用法的区别
  • 我想不出一种变异方式,因为所有涉及的类型(char、int、String)都是不可变的,所以该类的任何字段都是不可变的。有什么方法可以改变它们中的任何一个,即使是final?如果是这样,请告诉我。我了解final 和不变性之间的区别,但我认为在这种情况下这不是重点
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-09
相关资源
最近更新 更多