Java类滥用 - 最佳实践

时间:2016-02-10 15:07:40

标签: java class procedural-programming data-management

我很确定我没有做正确的课程相关的事情。

我正在使用一个类来创建一组变量(比如javascript对象可能但不是真的)。​​

我正在使用它,如下所示(基本示例)

public class myScript {

    public static void main(String[] args) {

        Client   warehouse          = new Client();
        Contacts warehouseContactsA = new Contacts();
        Contacts warehouseContactsB = new Contacts();

        warehouse.idno = 1;
        warehouse.name = "warehouse";
        warehouse.desc = "I don't exist";

        warehouseContactsA.client_idno = 1;
        warehouseContactsA.email       = "emailAAA@place.com"

        warehouseContactsB.client_idno = 1;
        warehouseContactsB.email       = "emailBBB@place.com"            

        insertIntoDB(warehouse,
                     warehouseContactsA,
                     warehouseContactsB);

    }

    public static void insertIntoDB(Client   warehouse,
                                    Contacts warehouseContactsA,
                                    Contacts warehouseContactsB) {

        // code to insert into database here

    }

    private class Client {
        int      idno;
        String   name;
        String   desc;
    }

    private class Contacts {
        int      client_idno;
        String   email;
    }

}

有没有理由不以这种方式使用类,如果有的话,有更简单的方法来存储/管理不需要类的数据?

4 个答案:

答案 0 :(得分:2)

创建内部类可能会给你带来陷阱。当你没有将它们定义为静态时,它们需要一个隐式引用回到你的代码不需要的外部类,它只会妨碍并导致模糊的错误。也许你这样做,所以你只能编译一个类,避免使用构建脚本?使用gradle的简单构建脚本是微不足道的(不像我们使用ant时的旧时代),所以这应该不是问题。将持久性实体移到单独的文件中会更好。

您对数据库连接和事务的处理方式尚不清楚。通常,尝试在自己的事务中执行每个插入是不好的,只是因为每个事务都有开销并且它增加了插入需要运行的时间。通常,您需要批量处理插入。

但是,主要是,如果您正在编写脚本,请使用脚本语言。 Groovy可能是一个不错的选择:

  • 您不需要程序脚本部分的外部类
  • 您可以在一个文件中定义多个公共类
  • Groovy包含一个用于简化JDBC代码的groovy.sql api。

答案 1 :(得分:1)

import java.util.Arrays;
import java.util.List;

public final class WarehouseRepository {

    public static void main(String[] args) {

        WarehouseRepository repository = new WarehouseRepository();

        Client warehouse = new Client(1, "warehouse", "I don't exist");
        Contacts warehouseContactsA = new Contacts(1, "emailAAA@place.com");
        Contacts warehouseContactsB = new Contacts(1, "emailBBB@place.com");

        repository.insertIntoDB(warehouse, Arrays.asList(warehouseContactsA, warehouseContactsB));
    }

    public void insertIntoDB(Client warehouse, List<Contacts> contacts) {
        // code to insert into database here
    }
}

final class Client {
    private final int id;
    private final String name;
    private final String desc;

    public Client(int id, String name, String desc) {
        this.id = id;
        this.name = name;
        this.desc = desc;
    }

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public String getDesc() {
        return desc;
    }
}

final class Contacts {
    private final int clientName;
    private final String email;

    public Contacts(int clientName, String email) {
        this.clientName = clientName;
        this.email = email;
    }

    public int getClientName() {
        return clientName;
    }

    public String getEmail() {
        return email;
    }
}

有些事情需要注意:

  1. 尝试用他们的意图和一些Java约定来命名类。例如,执行数据库操作的类通常称为repository
  2. 除非必要,否则请将类和变量设为最终版。
  3. 将字段设为私有,如果必须有,则将它们设为构造函数参数,而不是public或getter / setter。
  4. 如果有多个与客户关联的联系人,那么最好在客户端中将List<Contact>作为字段。

答案 2 :(得分:0)

是的,这是一个足够好的代表。

不,这不理想。你可以改变一些事情来改善这种情况:

可见性选项1:使用访问者隐私

你可以通过你的&#34; bean&#34;来使事情变得更加个性化。类(即仅具有数据存储目的的对象,没有逻辑)字段为private,然后使用公共访问器来屏蔽内部表示:

public class Client {
  private int id;
  public int getId() { return this.id; }
  public void setId(int id) { this.id = id; }
}

可见性选项2:使您的bean不可变

另一个选择是让你的bean不可变(这样你就可以在多线程环境中无意中传递它们)并且还保证它们被正确初始化并且没有人在非法状态下写入它们(例如,删除/清零id而不是其余数据):

public class Client {
  public final int id;
  public Client(int id) { this.id = id; }
}

最后,如果您有可能存在或不存在的内容(例如描述&#34;我不存在&#34;),我建议使用可选类型,而不是而不只是字符串类型。

答案 3 :(得分:0)

我会使用Map<String,String>来存储属性。 我将String和int作为字符串存储在哪里,并在需要时将它们解析回来。

希望有所帮助