为什么阿里巴巴禁止开发人员使用isSuccess作为变量名

java中避免使用“isSuccess“作为变量名的原因和解决方法 通过抛出异常,可以更好地表达程序的意图和状态,同时也提供了更多的灵活性和可读性。异常可以提供更详细的错误信息,方便调试和处理错误,同时也避免了需要手动检查布尔字段的逻辑。通过抛出异常来指示错误,可以提高代码的清晰度和可维护性,并将错误处理逻辑集中在异常处理代码中。这样的命名更符合Java的命名习惯,提高了代码的可读性,并且更容易与其他开发人员共享代码。这样可以避免依赖一个布尔类型的字段来判断是否出现问题,而是通过异常来明确地表示错误的发生。 阅读详情

分享一篇好文!

来源的公众号:Hollis  作者:Hollis

在日常开发中,我们会经常要在类中定义布尔类型的变量,比如在给外部系统提供一个RPC接口的时候,我们一般会定义一个字段表示本次请求是否成功的。

关于这个”本次请求是否成功”的字段的定义,其实是有很多种讲究和坑的,稍有不慎就会掉入坑里,作者在很久之前就遇到过类似的问题,本文就来围绕这个简单分析一下。到底该如何定一个布尔类型的成员变量。

一般情况下,我们可以有以下四种方式来定义一个布尔类型的成员变量:


 
boolean successboolean isSuccessBoolean successBoolean isSuccess
boolean isSuccess
Boolean success
Boolean isSuccess


以上四种定义形式,你日常开发中最常用的是哪种呢?到底哪一种才是正确的使用姿势呢?

通过观察我们可以发现,前两种和后两种的主要区别是变量的类型不同,前者使用的是boolean,后者使用的是Boolean。

另外,第一种和第三种在定义变量的时候,变量命名是success,而另外两种使用isSuccess来命名的。

首先,我们来分析一下,到底应该是用success来命名,还是使用isSuccess更好一点。

640? success 还是 isSucces 640?

到底应该是用success还是isSuccess来给变量命名呢?从语义上面来讲,两种命名方式都可以讲的通,并且也都没有歧义。那么还有什么原则可以参考来让我们做选择呢。


在阿里巴巴Java开发手册中关于这一点,有过一个『强制性』规定:

640?wx_fmt=jpeg
那么,为什么会有这样的规定呢?我们看一下POJO中布尔类型变量不同的命名有什么区别吧。


 
class Model1  {   private Boolean isSuccess;   public void setSuccess(Boolean success) {       isSuccess = success;   }   public Boolean getSuccess() {       return isSuccess;   }}class Model2 {   private Boolean success;   public Boolean getSuccess() {       return success;   }   public void setSuccess(Boolean success) {       this.success = success;   }}class Model3 {   private boolean isSuccess;   public boolean isSuccess() {       return isSuccess;   }   public void setSuccess(boolean success) {       isSuccess = success;   }}class Model4 {   private boolean success;   public boolean isSuccess() {       return success;   }   public void setSuccess(boolean success) {       this.success = success;   }}
   private Boolean isSuccess;
   public void setSuccess(Boolean success) {
       isSuccess = success;
   }
   public Boolean getSuccess() {
       return isSuccess;
   }
}

class Model2 {
   private Boolean success;
   public Boolean getSuccess() {
       return success;
   }
   public void setSuccess(Boolean success) {
       this.success = success;
   }
}

class Model3 {
   private boolean isSuccess;
   public boolean isSuccess() {
       return isSuccess;
   }
   public void setSuccess(boolean success) {
       isSuccess = success;
   }
}

class Model4 {
   private boolean success;
   public boolean isSuccess() {
       return success;
   }
   public void setSuccess(boolean success) {
       this.success = success;
   }
}


以上代码的setter/getter是使用Intellij IDEA自动生成的,仔细观察以上代码,你会发现以下规律:

  • 基本类型自动生成的getter和setter方法,名称都是isXXX()和setXXX()形式的。

  • 包装类型自动生成的getter和setter方法,名称都是getXXX()和setXXX()形式的。


既然,我们已经达成一致共识使用基本类型boolean来定义成员变量了,那么我们再来具体看下Model3和Model4中的setter/getter有何区别。

3y:看到这里的同学可能有点懵,为啥这里说“已经达成一致共识使用基本类型boolean来定义成员变量” 。其实原作者就这篇文章写了两篇。至于为什么原作者赞同使用基本数据类型,可以看为什么赞同boolean使用基本数据类型。本文的后面也有相应解释。

我们可以发现,虽然Model3和Model4中的成员变量的名称不同,一个是success,另外一个是isSuccess,但是他们自动生成的getter和setter方法名称都是isSuccess和setSuccess。

Java Bean中关于setter/getter的规范

关于Java Bean中的getter/setter方法的定义其实是有明确的规定的,根据JavaBeans(TM) Specification规定,如果是普通的参数,命名为propertyName,需要通过以下方式定义其setter/getter:


 
public <PropertyType> get<PropertyName>();public void set<PropertyName>(<PropertyType> a);
public void set<PropertyName>(<PropertyType> a);


但是,布尔类型的变量propertyName则是另外一套命名原则的:


 
public boolean is<PropertyName>();public void set<PropertyName>(boolean m);boolean is<PropertyName>();
public void set<PropertyName>(boolean m);


640?wx_fmt=jpeg

通过对照这份JavaBeans规范,我们发现,在Model4中,变量名为isSuccess,如果严格按照规范定义的话,他的getter方法应该叫isIsSuccess。但是很多IDE都会默认生成为isSuccess。

那这样做会带来什么问题呢。

在一般情况下,其实是没有影响的。但是有一种特殊情况就会有问题,那就是发生序列化的时候。

序列化带来的影响

关于序列化和反序列化请参考Java对象的序列化与反序列化。我们这里拿比较常用的JSON序列化来举例,看看常用的fastJson、jackson和Gson之间有何区别:


 
/*** @author Hollis*/public class BooleanMainTest {   public static void main(String[] args) throws IOException {       //定一个Model3类型       Model3 model3 = new Model3();       model3.setSuccess(true);       //使用fastjson(1.2.16)序列化model3成字符串并输出       System.out.println("Serializable Result With fastjson :" + JSON.toJSONString(model3));       //使用Gson(2.8.5)序列化model3成字符串并输出       Gson gson =new Gson();       System.out.println("Serializable Result With Gson :"+gson.toJson(model3));       //使用jackson(2.9.7)序列化model3成字符串并输出       ObjectMapper om = new ObjectMapper();       System.out.println("Serializable Result With jackson :" +om.writeValueAsString(model3));   }}class Model3 implements Serializable {   private static final long serialVersionUID = 1836697963736227954L;   private boolean isSuccess;   public boolean isSuccess() {       return isSuccess;   }   public void setSuccess(boolean success) {       isSuccess = success;   }   public String getHollis(){       return "hollischuang";   }}class BooleanMainTest {

   public static void main(String[] args) throws IOException {
       //定一个Model3类型
       Model3 model3 = new Model3();
       model3.setSuccess(true);

       //使用fastjson(1.2.16)序列化model3成字符串并输出
       System.out.println("Serializable Result With fastjson :" + JSON.toJSONString(model3));

       //使用Gson(2.8.5)序列化model3成字符串并输出
       Gson gson =new Gson();
       System.out.println("Serializable Result With Gson :"+gson.toJson(model3));

       //使用jackson(2.9.7)序列化model3成字符串并输出
       ObjectMapper om = new ObjectMapper();
       System.out.println("Serializable Result With jackson :" +om.writeValueAsString(model3));
   }
}

class Model3 implements Serializable {

   private static final long serialVersionUID = 1836697963736227954L;
   private boolean isSuccess;
   public boolean isSuccess() {
       return isSuccess;
   }
   public void setSuccess(boolean success) {
       isSuccess = success;
   }
   public String getHollis(){
       return "hollischuang";
   }
}


以上代码的Model3中,只有一个成员变量即isSuccess,三个方法,分别是IDE帮我们自动生成的isSuccess和setSuccess,另外一个是作者自己增加的一个符合getter命名规范的方法。

以上代码输出结果:


 
Serializable Result With fastjson :{"hollis":"hollischuang","success":true}Serializable Result With Gson :{"isSuccess":true}Serializable Result With jackson :{"success":true,"hollis":"hollischuang"}"hollischuang","success":true}
Serializable Result With Gson :{"isSuccess":true}
Serializable Result With jackson :{"success":true,"hollis":"hollischuang"}


在fastjson和jackson的结果中,原来类中的isSuccess字段被序列化成success,并且其中还包含hollis值。而Gson中只有isSuccess字段。

我们可以得出结论:fastjson和jackson在把对象序列化成json字符串的时候,是通过反射遍历出该类中的所有getter方法,得到getHollis和isSuccess,然后根据JavaBeans规则,他会认为这是两个属性hollis和success的值。直接序列化成json:


 
{“hollis”:”hollischuang”,”success”:true}


但是Gson并不是这么做的,他是通过反射遍历该类中的所有属性,并把其值序列化成json:


 
{“isSuccess”:true}


可以看到,由于不同的序列化工具,在进行序列化的时候使用到的策略是不一样的,所以,对于同一个类的同一个对象的序列化结果可能是不同的。

前面提到的关于对getHollis的序列化只是为了说明fastjson、jackson和Gson之间的序列化策略的不同,我们暂且把他放到一边,我们把他从Model3中删除后,重新执行下以上代码,得到结果:


 
Serializable Result With fastjson :{"success":true}Serializable Result WithGson :{"isSuccess":true}Serializable Result With jackson :{"success":true}true}
Serializable Result WithGson :{"isSuccess":true}
Serializable Result With jackson :{"success":true}


现在,不同的序列化框架得到的json内容并不相同,如果对于同一个对象,我使用fastjson进行序列化,再使用Gson反序列化会发生什么?


 
public class BooleanMainTest {   public static void main(String[] args) throws IOException {       Model3 model3 = new Model3();       model3.setSuccess(true);       Gson gson =new Gson();       System.out.println(gson.fromJson(JSON.toJSONString(model3),Model3.class));   }}class Model3 implements Serializable {   private static final long serialVersionUID = 1836697963736227954L;   private boolean isSuccess;   public boolean isSuccess() {       return isSuccess;   }   public void setSuccess(boolean success) {       isSuccess = success;   }   @Override   public String toString() {       return new StringJoiner(", ", Model3.class.getSimpleName() + "[","]")           .add("isSuccess=" + isSuccess)           .toString();   }}class BooleanMainTest {
   public static void main(String[] args) throws IOException {
       Model3 model3 = new Model3();
       model3.setSuccess(true);
       Gson gson =new Gson();
       System.out.println(gson.fromJson(JSON.toJSONString(model3),Model3.class));
   }
}

class Model3 implements Serializable {
   private static final long serialVersionUID = 1836697963736227954L;
   private boolean isSuccess;
   public boolean isSuccess() {
       return isSuccess;
   }
   public void setSuccess(boolean success) {
       isSuccess = success;
   }
   @Override
   public String toString() {
       return new StringJoiner(", ", Model3.class.getSimpleName() + "[","]")
           .add("isSuccess=" + isSuccess)
           .toString();
   }
}


以上代码,输出结果:

Model3[isSuccess=false]

这和我们预期的结果完全相反,原因是因为JSON框架通过扫描所有的getter后发现有一个isSuccess方法,然后根据JavaBeans的规范,解析出变量名为success,把model对象序列化城字符串后内容为{"success":true}。

根据{"success":true}这个json串,Gson框架在通过解析后,通过反射寻找Model类中的success属性,但是Model类中只有isSuccess属性,所以,最终反序列化后的Model类的对象中,isSuccess则会使用默认值false。

但是,一旦以上代码发生在生产环境,这绝对是一个致命的问题。

所以,作为开发者,我们应该想办法尽量避免这种问题的发生,对于POJO的设计者来说,只需要做简单的一件事就可以解决这个问题了,那就是把isSuccess改为success。

这样,该类里面的成员变量时success,getter方法是isSuccess,这是完全符合JavaBeans规范的。无论哪种序列化框架,执行结果都一样。就从源头避免了这个问题。

引用一下R大关于阿里巴巴Java开发手册中这条规定的评价

(https://www.zhihu.com/question/55642203):

640?wx_fmt=jpeg所以,在定义POJO中的布尔类型的变量时,不要使用isSuccess这种形式,而要直接使用success!

Boolean还是boolean?

前面我们介绍完了在success和isSuccess之间如何选择,那么排除错误答案后,备选项还剩下:

boolean successBoolean success success
Boolean success

那么,到底应该是用Boolean还是boolean来给定一个布尔类型的变量呢?

我们知道,boolean是基本数据类型,而Boolean是包装类型。关于基本数据类型和包装类之间的关系和区别请参考一文读懂什么是Java中的自动拆装箱

那么,在定义一个成员变量的时候到底是使用包装类型更好还是使用基本数据类型呢?

我们来看一段简单的代码


 
/*** @author Hollis*/public class BooleanMainTest {   public static void main(String[] args) {       Model model1 = new Model();       System.out.println("default model : " + model1);   }}class Model {   /**    * 定一个Boolean类型的success成员变量    */   private Boolean success;   /**    * 定一个boolean类型的failure成员变量    */   private boolean failure;   /**    * 覆盖toString方法,使用Java 8 的StringJoiner    */   @Override   public String toString() {       return new StringJoiner(", ", Model.class.getSimpleName() + "[","]")           .add("success=" + success)           .add("failure=" + failure)           .toString();   }}public class BooleanMainTest {
   public static void main(String[] args) {
       Model model1 = new Model();
       System.out.println("default model : " + model1);
   }
}

class Model {
   /**
    * 定一个Boolean类型的success成员变量
    */

   private Boolean success;
   /**
    * 定一个boolean类型的failure成员变量
    */

   private boolean failure;

   /**
    * 覆盖toString方法,使用Java 8 的StringJoiner
    */

   @Override
   public String toString() 
{
       return new StringJoiner(", ", Model.class.getSimpleName() + "[","]")
           .add("success=" + success)
           .add("failure=" + failure)
           .toString();
   }
}

以上代码输出结果为:


 
default model : Model[success=null, failure=false]null, failure=false]


可以看到,当我们没有设置Model对象的字段的值的时候,Boolean类型的变量会设置默认值为null,而boolean类型的变量会设置默认值为false。

即对象的默认值是null,boolean基本数据类型的默认值是false。

在阿里巴巴Java开发手册中,对于POJO中如何选择变量的类型也有着一些规定:

640?wx_fmt=png


这里建议我们使用包装类型,原因是什么呢?


举一个扣费的例子,我们做一个扣费系统,扣费时需要从外部的定价系统中读取一个费率的值,我们预期该接口的返回值中会包含一个浮点型的费率字段。当我们取到这个值得时候就使用公式:金额*费率=费用 进行计算,计算结果进行划扣。


如果由于计费系统异常,他可能会返回个默认值,如果这个字段是Double类型的话,该默认值为null,如果该字段是double类型的话,该默认值为0.0。


如果扣费系统对于该费率返回值没做特殊处理的话,拿到null值进行计算会直接报错,阻断程序。拿到0.0可能就直接进行计算,得出接口为0后进行扣费了。这种异常情况就无法被感知。


这种使用包装类型定义变量的方式,通过异常来阻断程序,进而可以被识别到这种线上问题。如果使用基本数据类型的话,系统可能不会报错,进而认为无异常。


以上,就是建议在POJO和RPC的返回值中使用包装类型的原因。


在之前那篇文章的解析中,作者的观点是,对于布尔类型的变量,我认为可以和其他类型区分开来,作者并不认为使用null进而导致NPE是一种最好的实践。因为布尔类型只有true/false两种值,我们完全可以和外部调用方约定好当返回值为false时的明确语义。


所以之前建议大家使用boolean来定义success变量,后来有读者评论或者私下和我沟通,关于这部分内容又有了一些新的思考。


后来,作者单独和《阿里巴巴Java开发手册》、《码出高效》的作者——孤尽 单独1V1(qing) Battle(jiao)了一下。最终达成共识,还是尽量使用包装类型。


但是,作者还是想强调一个我的观点,尽量避免在你的代码中出现不确定的null值。


null何罪之有?

null是很模棱两可的,很多时候会导致令人疑惑的错误,很难去判断返回一个null代表着什么意思。

图灵奖得主Tony Hoare 曾经公开表达过null是一个糟糕的设计。

640?wx_fmt=jpeg

我把 null 引用称为自己的十亿美元错误。它的发明是在1965 年,那时我用一个面向对象语言( ALGOL W )设计了第一个全面的引用类型系统。我的目的是确保所有引用的使用都是绝对安全的,编译器会自动进行检查。但是我未能抵御住诱惑,加入了Null引用,仅仅是因为实现起来非常容易。它导致了数不清的错误、漏洞和系统崩溃,可能在之后 40 年中造成了十亿美元的损失。


当我们在设计一个接口的时候,对于接口的返回值的定义,尽量避免使用Boolean类型来定义。大多数情况下,别人使用我们的接口返回值时可能用if(response.isSuccess){}else{}的方式,如果我们由于忽略没有设置success字段的值,就可能导致NPE,这明显是我们不希望看到的。


当然,编程中并没有绝对。两种方式是两种思维方式,多提供一种思路,供读者们在日常开发中自行选择。

640? 总结 640?

本文围绕布尔类型的变量定义的类型和命名展开了介绍,最终我们可以得出结论,在定义一个布尔类型的变量,尤其是一个给外部提供的接口返回值时,要使用success来命名,阿里巴巴Java开发手册建议使用封装类来定义POJO和RPC返回值中的变量。但是这不意味着可以随意的使用null,我们还是要尽量避免出现对null的处理的。


好啦,以上就是关于POJO中布尔类型变量的正确定义姿势。你用对了么?


乐于输出干货的Java技术公众号:Java3y。200多篇原创技术文章、海量视频资源、精美脑图!

640?wx_fmt=jpeg
帅的人都关注了
觉得我的文章写得不错,不妨点一下 好看 并 分享 给朋友!


Java开发手册中为什么禁止使用isSuccess作为布尔类型变量名以及POJO中基本类型与包装类型的使用标准 Java开发手册中关于POJO的布尔类型的变量名的要求是:【强制】POJO 类中的任何布尔类型的变量,都不要加 is 前缀,否则部分框架解析会引起序列化错误。说明:在本文 MySQL 规约中的建表约定第一条,表达是与否的变量采用 is_xxx 的命名方式,所以,需要在设置从 is_xxx 到 xxx 的映射关系。反例:定义为基本数据类型 Boolean isDeleted 的属性,它的方法也是 isDeleted(),框架在反向解析的时候, 阅读详情

相关推荐

棋牌App逆向工程实战:透视风险分析与反作弊加固思路

在移动应用安全领域,逆向工程是一项关键的攻防技术,它通过静态分析、动态调试与协议抓包等手段,深入还原客户端真实逻辑。这项技术的核心原理,是从已编译的安装包中提取数据流,验证服务端下发的信息是否超出了客户端应有的可见范围。从技术价值看,安全测试人员可以借此定位协议层、内存层与缓存层的潜在风险,为反作弊体系提供精准的加固建议。在棋牌类App等实时对局场景中,逆向工程常被用于排查牌局信息泄露类隐患,而合规授权与测试环境是开展此类研究的必要前提。本文结合一次棋牌App的安全评估实践,梳理了从环境准备到数据流还原的完

weixin_29326909的博客 175

为什么阿里巴巴禁止开发人员使用isSuccess作为变量名(修订版)

在日常开发中,我们会经常要在类中定义布尔类型的变量,比如在给外部系统提供一个RPC接口的时候,我们一般会定义一个字段表示本次请求是否成功的。 关于这个”本次请求是否成功”的字段的定义,其实是有很多种讲究和坑的,稍有不慎就会掉入坑里,作者在很久之前就遇到过类似的问题,本文就来围绕这个简单分析一下。到底该如何定一个布尔类型的成员变量。 一般情况下,我们可以有以下四种方式来定义一个布尔类型的成员变量...

勇往直前的专栏 1万+

从零到一:手把手教你用YonBuilder for NCC搭建NC Cloud 2021.11开发环境(含避坑指南)

本文详细指导如何使用YonBuilder for NCC搭建NC Cloud 2021.11开发环境,涵盖硬件要求、软件安装、YonBuilder配置及常见故障排除。特别提供避坑指南,帮助开发者快速上手NCC开发,确保环境配置的原子化分解和开发思维的体系化建立。

weixin_42523326的博客 345

Netty 基础-组件之Future & Promise

netty 中的 Future 与 jdk 中的 Future 同名,但是是两个接口,netty 的 Future 继承自 jdk 的 Future,而 Promise 又对 netty的Future扩展 jdk Future 只能同步等待任务结束(或成功、或失败)才能得到结果 netty Future 可以同步等待任务结束得到结果,也可以异步方式得到结果,但都是要等任务结束 netty Promise 不仅有 netty Future 的功能,而且脱离了任务独立存在,只作为两个线程间传递结果的容器

秃头的博客 459

薄膜比拟、开口截面扭转承载力以及风电混塔水平缝张开状态下抗扭承载力推导

风电混塔水平缝张开状态下的抗扭承载力推导,从弹性力学说起

George的博客 873

Kubernetes+EdgeX:构建企业级AI边缘推理平台

设备:工业摄像头(RTSP协议,输出1920x1080视频流);AI模型:YOLOv8训练的轴承裂纹检测模型(识别“裂纹”“正常”两种类型);目标:摄像头采集图像→EdgeX传输数据→K8s推理服务检测→结果反馈到报警器(HTTP协议)。Kubernetes+EdgeX的组合,为企业构建AI边缘推理平台提供了标准化、可扩展标准化:K8s的容器编排和EdgeX的设备管理,都是行业标准,避免“重复造轮子”;可扩展:支持从单边缘节点到 thousands of nodes 的规模,满足企业的增长需求;

AI算力网络与通信的博客 1344

【网络编程】零基础到精通--Netty 入门

详细分析如下。

weixin_60257072的博客 947

3台虚拟机部署Doris详细文档(含校验步骤)

摘要:本文详细介绍了Apache Doris在3台虚拟机上的集群部署方案。采用1主FE+1从FE+1观察者FE+3BE的混合部署模式,确保元数据高可用性。硬件配置建议测试环境4核16GB内存,生产环境8核64GB内存。部署步骤包括系统环境配置(关闭防火墙、内核参数优化)、FE/BE节点配置启动、集群初始化验证等。重点配置了IP白名单(172.30.0.115)和数据目录(/data/doris)。通过MySQL客户端和WebUI可监控集群状态,实现千万级数据的实时分析能力,后续可通过增加BE节点线性扩展。

weixin_41026747的博客 933

为什么阿里巴巴禁止开发人员使用isSuccess作为变量名?

在日常开发中,我们会经常要在类中定义布尔类型的变量,比如在给外部系统提供一个RPC接口的时候,我们一般会定义一个字段表示本次请求是否成功的。 关于这个”本次请求是否成功”的字段的定义,其实是有很多种讲究和坑的,稍有不慎就会掉入坑里,作者在很久之前就遇到过类似的问题,本文就来围绕这个简单分析一下。到底该如何定一个布尔类型的成员变量。 一般情况下,我们可以有以下四种方式来定义一个布尔类型的成员变量...

xiaoman0743的博客 281

【GlobalMapper精品教程】001:GlobalMapper23+24+25 Pro-x64中文汉化版安装教程(附软件包下载)

Global Mapper 23+V24+V25中文汉化版安装教程及免费下载地址,是一款非常专业的地图绘制软件,功能非常的丰富,内置距离和面积计算,包括光栅混合、对比度调节、海拔高度查询、视线计算以及一些高级功能,通过地表数据观察分水岭、对3Dpoint数据转换为三角多边形和网格化等设置。本文讲解GlobalMapper23.1 Pro-x64安装过程。

智慧空间实验室 3万+

【小白深度教程 1.3】使用 BP-Net 深度补全网络,进行 KITTI 稠密点云和图像融合(Depth Completion 实战)

在上一节中,我们展示了如何将从激光雷达获取的稀疏点云(深度)映射到图像。因此这篇论文我们尝试使用 Depth Completion(深度补全)技术,来将稀释的点云深度,补全为稠密深度。

2401_87064292的博客 1199

【java】为什么阿里巴巴禁止开发人员使用isSuccess作为变量名

在日常开发中,我们会经常要在类中定义布尔类型的变量,比如在给外部系统提供一个RPC接口的时候,我们一般会定义一个字段表示本次请求是否成功的。 关于这个”本次请求是否成功”的字段的定义,其实是有很多种讲究和坑的,稍有不慎就会掉入坑里,作者在很久之前就遇到过类似的问题,本文就来围绕这个简单分析一下。到底该如何定一个布尔类型的成员变量。 一般情况下,我们可以有以下四种方式来定义一个布尔类型的成员变量...

疯一样的女子 894

大模型——Dify:知识库与外部知识库

摘要 Dify的知识库功能为开发者提供了动态知识管理解决方案,超越了大模型静态预训练数据的限制。知识库支持多种文档格式(如txt、pdf、docx等),通过文档分段、索引设置和检索优化机制提升LLM的响应准确性。系统提供高质量和经济两种索引模式,前者采用向量化检索技术,后者使用关键词匹配以降低成本。知识库支持元数据管理,包括自动生成的内置元数据和用户自定义元数据,便于内容分类和检索。对于高级需求,Dify还支持连接外部知识库,通过API实现跨平台数据共享和检索优化,满足企业级知识管理需求。

732

解读阿里巴巴Java手册:为什么禁止开发人员使用isSuccess作为变量名

JavaBean定义 无规矩不成方圆,Java IDE在代码检查或者自动生成时都要遵循一定的Java规范(并非100%,但就是因为不是100%按规范才容易出问题),先来看一下Java规范对于javabean时如何定义的。 据JavaBeans™ Specification规定,如果是普通的参数propertyName,要以以下方式定义其setter/getter: public <PropertyType> get<PropertyName>(); public void set&l

梦里蓝天 999

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

javabeans是什么_为什么阿里巴巴禁止开发人员使用isSuccess作为变量名?

在日常开发中,我们会经常要在类中定义布尔类型的变量,比如在给外部系统提供一个RPC接口的时候,我们一般会定义一个字段表示本次请求是否成功的。关于这个”本次请求是否成功”的字段的定义,其实是有很多种讲究和坑的,稍有不慎就会掉入坑里,作者在很久之前就遇到过类似的问题,本文就来围绕这个简单分析一下。到底该如何定一个布尔类型的成员变量。一般情况下,我们可以有以下四种方式来定义一个布尔类型的成员变量:boo...

weixin_39687542的博客 111

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

为什么阿里巴巴禁止开发人员使用isSuccess作为变量名 侵立删

转自:https://mp.weixin.qq.com/s/wJI4w4uZsemhMPbeDYb2zg 在日常开发中,我们会经常要在类中定义布尔类型的变量,比如在给外部系统提供一个RPC接口的时候,我们一般会定义一个字段表示本次请求是否成功的。 关于这个”本次请求是否成功”的字段的定义,其实是有很多种讲究和坑的,稍有不慎就会掉入坑里,作者在很久之前就遇到过类似的问题,本文就来围绕这个简单分析...

心神沫沫的收藏 185

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

上一篇: Redis几道常见的面试题!
下一篇: SpringBoot自动配置原理!
Java3y
Java3y 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 1万+粉丝 509原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值