Java类误用-最佳实践
我相当肯定我没有正确地做一些与类相关的事情 我使用一个类来创建一组变量(比如javascript对象,可能是但不是真的) 我正在使用它,如下所示(一个基本示例)Java类误用-最佳实践,java,class,procedural-programming,data-management,Java,Class,Procedural Programming,Data Management,我相当肯定我没有正确地做一些与类相关的事情 我使用一个类来创建一组变量(比如javascript对象,可能是但不是真的) 我正在使用它,如下所示(一个基本示例) 有没有理由不这样使用类?如果有,有没有更简单的方法来存储/管理不需要类的数据?创建内部类可能会给您带来陷阱。如果不将它们定义为静态,那么它们需要隐式引用回外部类,而您的代码不需要外部类,它只会妨碍您的工作并导致模糊错误。也许这样做是为了只编译一个类,避免生成脚本?使用gradle的简单构建脚本是微不足道的(不像我们以前使用ant时那样糟
有没有理由不这样使用类?如果有,有没有更简单的方法来存储/管理不需要类的数据?创建内部类可能会给您带来陷阱。如果不将它们定义为静态,那么它们需要隐式引用回外部类,而您的代码不需要外部类,它只会妨碍您的工作并导致模糊错误。也许这样做是为了只编译一个类,避免生成脚本?使用gradle的简单构建脚本是微不足道的(不像我们以前使用ant时那样糟糕),所以这不应该成为一个问题。最好将持久性实体移出到单独的文件中 您对数据库连接和事务所做的操作并不清楚。通常,尝试在自己的事务中进行每个插入是不好的,因为每个事务都有开销,并且增加了插入需要运行的时间。通常,您希望成批处理插入 不过,如果您正在编写脚本,则主要使用脚本语言。Groovy可能是一个不错的选择:
- 程序脚本部分不需要外部类
- 您可以在一个文件中定义多个公共类
- Groovy包括一个用于简化JDBC代码的Groovy.sqlAPI李>
- 是的,这是一个足够好的表示
不,不太理想。为了改善这种情况,您可以改变以下几点:
可见性选项1:使用访问者将事物私有化
通过将“bean”类(即仅用于数据存储的对象,没有逻辑)字段设置为私有字段,然后使用公共访问器来屏蔽内部表示,可以使事情更加面向对象:
可见性选项2:使您的bean不可变 另一种选择是使bean不可变(以便您可以在多线程环境中随意传递它们),并确保它们已正确初始化,并且没有人以非法状态写入它们(例如删除/归零id,但不删除其余数据): 最后,如果您有可能存在或不存在的内容(例如描述“我不存在”),我建议使用可选类型,而不仅仅是字符串类型。我会使用public class Client { private int id; public int getId() { return this.id; } public void setId(int id) { this.id = id; } }
来存储属性。 在这里,我将字符串和int存储为字符串,并在需要时解析它们 希望它能帮助导入java.util.array;映射
导入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(){ 回复邮件; } } 需要注意的一些事项: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约定来命名类。例如,执行数据库操作的类通常称为
repository
- 除非需要,否则将类和变量设为最终值
- 将字段设置为私有字段,如果它们必须具有,则将其设置为构造函数参数,而不是公共或getter/setter
- 如果可以有多个联系人与客户机关联,那么最好在客户机中设置
as字段List
是的,您可以使用更面向对象的范例。您可以将联系人添加到客户端(例如,作为数组),因为联系人始终与客户端连接。同样正如@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; } }
- 尝试用它们的意图和一些Java约定来命名类。例如,执行数据库操作的类通常称为