Java类误用-最佳实践

Java类误用-最佳实践,java,class,procedural-programming,data-management,Java,Class,Procedural Programming,Data Management,我相当肯定我没有正确地做一些与类相关的事情 我使用一个类来创建一组变量(比如javascript对象,可能是但不是真的) 我正在使用它,如下所示(一个基本示例) 有没有理由不这样使用类?如果有,有没有更简单的方法来存储/管理不需要类的数据?创建内部类可能会给您带来陷阱。如果不将它们定义为静态,那么它们需要隐式引用回外部类,而您的代码不需要外部类,它只会妨碍您的工作并导致模糊错误。也许这样做是为了只编译一个类,避免生成脚本?使用gradle的简单构建脚本是微不足道的(不像我们以前使用ant时那样糟

我相当肯定我没有正确地做一些与类相关的事情

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

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


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

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

您对数据库连接和事务所做的操作并不清楚。通常,尝试在自己的事务中进行每个插入是不好的,因为每个事务都有开销,并且增加了插入需要运行的时间。通常,您希望成批处理插入

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

  • 程序脚本部分不需要外部类
  • 您可以在一个文件中定义多个公共类
  • Groovy包括一个用于简化JDBC代码的Groovy.sqlAPI
      是的,这是一个足够好的表示

      不,不太理想。为了改善这种情况,您可以改变以下几点:

      可见性选项1:使用访问者将事物私有化

      通过将“bean”类(即仅用于数据存储的对象,没有逻辑)字段设置为私有字段,然后使用公共访问器来屏蔽内部表示,可以使事情更加面向对象:

      public class Client {
        private int id;
        public int getId() { return this.id; }
        public void setId(int id) { this.id = id; }
      }
      
      可见性选项2:使您的bean不可变

      另一种选择是使bean不可变(以便您可以在多线程环境中随意传递它们),并确保它们已正确初始化,并且没有人以非法状态写入它们(例如删除/归零id,但不删除其余数据):

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

      我会使用
      映射
      来存储属性。 在这里,我将字符串和int存储为字符串,并在需要时解析它们

      希望它能帮助导入java.util.array;
      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;
          }
      }
      
      导入java.util.List; 公共最终类仓库存储库{ 公共静态void main(字符串[]args){ WarehouseRepository=新建WarehouseRepository(); 客户仓库=新客户(1,“仓库”,“我不存在”); 联系人仓库联系人A=新联系人(1,“emailAAA@place.com"); 联系人仓库联系人SB=新联系人(1,“emailBBB@place.com"); repository.insertIntoDB(warehouse,Arrays.asList(warehouseContactsA,warehouseContactsB)); } public void insertIntoDB(客户仓库,列出联系人){ //要在此处插入数据库的代码 } } 最终类客户端{ 私有最终int id; 私有最终字符串名; 私有最终字符串描述; 公共客户端(int-id、字符串名称、字符串描述){ this.id=id; this.name=名称; this.desc=desc; } 公共int getId(){ 返回id; } 公共字符串getName(){ 返回名称; } 公共字符串getDesc(){ 返回描述; } } 期末班联系{ 私有的final int clientName; 私人最终字符串电子邮件; 公共联系人(int clientName、字符串电子邮件){ this.clientName=clientName; this.email=电子邮件; } public int getClientName(){ 返回clientName; } 公共字符串getEmail(){ 回复邮件; } } 需要注意的一些事项:

    • 尝试用它们的意图和一些Java约定来命名类。例如,执行数据库操作的类通常称为
      repository
    • 除非需要,否则将类和变量设为最终值
    • 将字段设置为私有字段,如果它们必须具有,则将其设置为构造函数参数,而不是公共或getter/setter
    • 如果可以有多个联系人与客户机关联,那么最好在客户机中设置
      List
      as字段

    • 是的,您可以使用更面向对象的范例。您可以将联系人添加到客户端(例如,作为数组),因为联系人始终与客户端连接。同样正如@Nathan所提到的,您可能希望在一个额外的类中声明您的对象(您可能希望再次使用它们,并且它们与您的脚本没有很强的相关性)。代码有很多地方可以而且应该改进。流是一个基本的示例,真正的程序不是这样的,它只是一个不切实际的演示。你可以使用构造函数,因为每当你创建一个新的客户端实例时,你都想给它一个id、名称和描述这是不可接受的代码。@ Max ZoMon小心地阐述为什么?让我们考虑一下一直发生的真实世界事件:客户端已经与另一个客户端合并。现在它的
      id
      name
      已经改变,但是
      description
      联系人保持不变。代码将如何处理更改?它是一个新客户端?就像任何不可变对象一样?
      
      public class Client {
        public final int id;
        public Client(int id) { this.id = id; }
      }
      
      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;
          }
      }