Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Java模拟结构是不是一种好方法?_Java - Fatal编程技术网

用Java模拟结构是不是一种好方法?

用Java模拟结构是不是一种好方法?,java,Java,有一次我在一家大型科技公司工作。我们用Java编程。那里的人非常聪明,他们喜欢在Java中用C/C++模拟struct。为了明确起见,他们主张创建充当“数据持有者”的类: 公共类图书信息{ 公开最终名单作者; 公共最终字符串书名; 公共图书信息(列出作者、字符串图书标题){ this.authors=作者; this.bookTitle=bookTitle; } @凌驾 公共字符串toString(){…} @凌驾 public int hashCode(){…} @凌驾 公共布尔等于(对象ob

有一次我在一家大型科技公司工作。我们用Java编程。那里的人非常聪明,他们喜欢在Java中用C/C++模拟struct。为了明确起见,他们主张创建充当“数据持有者”的类:

公共类图书信息{
公开最终名单作者;
公共最终字符串书名;
公共图书信息(列出作者、字符串图书标题){
this.authors=作者;
this.bookTitle=bookTitle;
}
@凌驾
公共字符串toString(){…}
@凌驾
public int hashCode(){…}
@凌驾
公共布尔等于(对象obj){…}
}
正如我们所看到的,这个类的目的只是保存数据。尽管我们违反了许多企业编程规则,例如不直接公开类字段和防御性复制,但这种类确实获得了简洁编码等好处。我们可以直接调用字段名,而不是调用getter和setter

让我恼火的是,这种类很难维护和扩展。很难维护,因为无法确保对象的状态是合法的。业务逻辑可能会说,一本书必须有一个标题和至少一位作者。但在现实世界中,对象可以有空标题、空标题、空作者列表或空作者列表,我们根本无法控制它。很难扩展。例如,如果数据源被更改为分别为作者名提供名字和姓氏,该怎么办?我必须使用两个字符串列表,而不是一个。更糟糕的是,数据结构的更改会影响数据和接口。由于我没有getAuthorNames()接口,因此可能需要在许多地方更改代码

我必须承认,上述情况并没有发生。我必须承认,所有使用该类的代码都在团队的控制之下,因此接口更改听起来不像编写供其他团队/公司使用的代码那么糟糕。所以,即使我们使用Java,一种纯OO语言,在企业级进行编码,也可以使用这样的编码标准吗

我知道可能没有一个“正确”的答案。我想听听个人意见。代表你自己大声说话

编辑:


嗯。我应该重新表述我问题的核心:牺牲一些教科书编码规则来获得简单性是否明智?当代码库增长和团队增长时,牺牲会对您造成影响吗?个人意见很重要,尤其是来自智者的意见,在许多情况下,没有对错问题,我们都只是遵循令人信服的意见。很抱歉,Stackoverflow只针对正确和错误的问题设计。在这种情况下,这个问题就应该结束了。

我认为有一个正确的答案:如果它对你有用,那就去做吧。没有什么样的警察等着逮捕你

了解规则及其背后的原因。当你打破它们时,要明白后果。对你所做的事有充分的理由。接受所发生的一切

例如,我不认为永远不公开数据的规则需要是绝对的——只要你做得正确

你需要意识到你做错了

事实上,您将列表引用设置为最终引用,这意味着引用无法更改。引用引用的列表可以添加和删除元素。你必须让它不变,才能实现你想要的

如果不使其不可变,则对传递到构造函数的引用所做的更改将反映在对象中。即使您将该引用设置为私有,这也是正确的。为了使对象的状态真正独立,必须复制传入的列表。与其他对可变类型的引用相同,如Date

它与字符串一起工作,因为它是不可变的

还有一件事:那应该是
equals()
,而不是
equals()
。案例在Java中很重要

public final class BookInformation {
    public final List<String> authors;
    public final String bookTitle;
    public final Date publicationDate;

    public BookInformation(List<String> authors, String bookTitle, Date publicationDate) {
        this.authors = Collections.unmodifiableList((authors == null) ? new ArrayList<String>() : authors);
        this.bookTitle = (StringUtils.isBlank(bookTitle) ? "" : bookTitle);
        this.publicationDate = ((publicationDate == null) ? new Date() : new Date(publicationDate.getTime()));
    }
    @Override
    public String toString() { ... }

    @Override
    public int hashCode() { ... }

    @Override

   public boolean equals(Object obj) { ... }
}
公开期末课程图书信息{
公开最终名单作者;
公共最终字符串书名;
公开最终日期发布日期;
公共图书信息(列出作者、字符串图书标题、日期publicationDate){
this.authors=Collections.unmodifiableList((authors==null)?new ArrayList():authors);
this.bookTitle=(StringUtils.isBlank(bookTitle)?“”:bookTitle);
this.publicationDate=((publicationDate==null)?new Date():new Date(publicationDate.getTime());
}
@凌驾
公共字符串toString(){…}
@凌驾
public int hashCode(){…}
@凌驾
公共布尔等于(对象obj){…}
}

我认为有一个正确的答案:如果它对你有效,那就去做。没有什么样的警察等着逮捕你

了解规则及其背后的原因。当你打破它们时,要明白后果。对你所做的事有充分的理由。接受所发生的一切

例如,我不认为永远不公开数据的规则需要是绝对的——只要你做得正确

你需要意识到你做错了

事实上,您将列表引用设置为最终引用,这意味着引用无法更改。引用引用的列表可以添加和删除元素。你必须让它不变,才能实现你想要的

如果不使其不可变,则对传递到构造函数的引用所做的更改将反映在对象中。即使您将该引用设置为私有,这也是正确的。为了使对象的状态真正独立,必须复制传入的列表。与其他对可变类型的引用相同,如Date

它与字符串一起工作,因为它是不可变的

还有一件事:那应该是
equals()
,而不是
equals()
。案例在Java中很重要

public final class BookInformation {
    public final List<String> authors;
    public final String bookTitle;
    public final Date publicationDate;

    public BookInformation(List<String> authors, String bookTitle, Date publicationDate) {
        this.authors = Collections.unmodifiableList((authors == null) ? new ArrayList<String>() : authors);
        this.bookTitle = (StringUtils.isBlank(bookTitle) ? "" : bookTitle);
        this.publicationDate = ((publicationDate == null) ? new Date() : new Date(publicationDate.getTime()));
    }
    @Override
    public String toString() { ... }

    @Override
    public int hashCode() { ... }

    @Override

   public boolean equals(Object obj) { ... }
}
公开期末课程图书信息{
公开最终名单作者;
公共最终字符串书名;
公开最后日期
public class BookInformation {
    private final Set<String> authors = new LinkedHashSet<>();
    private final String bookTitle;

    public BookInformation(List<String> authors, String bookTitle) {
        assert authors != null;
        assert bookTitle != null;

        for(String author: authors) addAuthor(author);
        this.bookTitle = bookTitle;
    }

    public String bookTitle() { return bookTitle; }

    // get all the authors without needing a defensive copy.
    // for(int i = 0, len = bookInfo.authorCount(); i < len; i++) {
    //     String name = bookInfo.author(i);

    public int authorCount() { return authors.size(); }
    public String author(int n) { return authors.get(n); }

    public void addAuthor(String name) {
        assert name != null
        authors.add(name);
    }
class AuthorCounter {
    private final ConcurrentMap<String, AtomicInteger> authorCountMap =
                  new ConcurrentHashMap<>();

    public void addAuthor(String name) {
        authorCountMap.putIfAbsent(name, new AtomicInteger());
    }

    public void incrCountFor(String name) {
        authorCountMap.get(name).incrementAndGet();
    }

    public int countForAuthor(String name) {
        AtomicInteger ai = authorCountMap.get(name);
        return ai == null ? 0 : ai.get();
    }
}