JAVA语意上的漏洞

转自:http://community.youkuaiyun.com/Expert/topic/4958/4958971.xml?temp=5.456179E-02 

对于长期使用C++的人来说,这样的语义确实叫人一下子难以接受。

/*
 * Main.java
 *
 * Created on 2006年8月17日, 下午8:28
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package javaapplication2;

/**
 *
 * @author Zenny Chen
 */

class Parent
{
    protected int t;
   
    public Parent()
    {
        System.out.println("Creating Parent...");
        create();
    }
   
    public void create()
    {
        System.out.println("Parent created!");
       
        t = 1;
    }
}

class Child extends Parent
{
    private int c;
   
    public void create()
    {
        c = 1;
        System.out.println("Child created!");
    }
   
    public Child()
    {
        System.out.println("Creating Child...");
        create();
    }
   
    public int getValue()
    {
        return c + t;
    }
}

public class Main {
   
    /** Creates a new instance of Main */
    public Main() {
    }
   
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
       
        Child ch = new Child();
       
        System.out.println("The result is: "+ch.getValue());
    }
}

从语义学和工程学角度,在Child对象被创建时首先要创建其父类域,然后可以根据父类属性
来获得创建自身资源的需要。然而Java在处理方法重写这个语义时,执行的是“一刀切”,
父类域尚未被创建完就开始调用其子类所重写的方法来。这样很可能造成子类的资源也无法
被初始化(若子类构造方法不去构建)。
从这点上,C++做得就比较好。创建一个对象就像造房子,一层一层建造。C++中虚函数的多态性
不会表现在构造函数和析构函数中,而且构造函数和析构函数也不会受到const对象的限制。
尽管在语义的实现上确实要比Java复杂一点,但符合语义学和工程学。

### Java 中实现语义相似度计算的方法和库 #### JWS —— Java WordNet Similarity JWS 是由 University of Sussex 的 David Hope 等开发的一个基于 Java 和 WordNet 的语义相似度计算开源项目[^1]。此工具提供了多种经典语义相似度算法的实现,适合用于研究目的。 ```java // 使用 JWS 计算两个单词间的语义相似度示例 import uk.ac.susx.mlcl.JWS.Similarity; import uk.ac.susx.mlcl.JWS.Word; public class SemanticSimilarityExample { public static void main(String[] args) throws Exception { String word1 = "car"; String word2 = "automobile"; double similarityScore = new Similarity().getMaxSim(new Word(word1), new Word(word2)); System.out.println("The semantic similarity between '" + word1 + "' and '" + word2 + "' is: " + similarityScore); } } ``` #### 基于向量空间模型 (VSM) 的方法 通过将文本转换为向量表示并应用距离度量(如余弦相似度),可以评估两段文字之间的语义关系[^5]。 ```java // 使用 Apache Commons Math 库中的类来计算余弦相似度 import org.apache.commons.math3.linear.ArrayRealVector; import java.util.Arrays; public class CosineSimilarityCalculator { private static final int VECTOR_SIZE = 10; // 向量维度取决于具体应用场景 /** * 将字符串映射到固定长度的向量 */ private ArrayRealVector stringToVector(String str){ // 这里省略了实际的文字转向量逻辑... return new ArrayRealVector(Arrays.stream(str.split("\\s+")) .mapToInt(Integer::parseInt).toArray()); } /** * 计算两个字符串的余弦相似度 */ public double getCosineSimilarity(String s1, String s2){ var v1 = stringToVector(s1); var v2 = stringToVector(s2); return v1.dotProduct(v2)/(v1.getNorm()*v2.getNorm()); } } ``` #### 利用预训练的大规模语言模型 现代 NLP 方法倾向于采用大规模预训练的语言模型来进行更复杂的自然语言处理任务,包括但不限于语义相似度计算[^2]。虽然这些模型主要是在 Python 生态系统中流行起来的,但在 JVM 上也有相应的解决方案,比如使用 Deeplearning4j 或者调用远程 API 接口服务。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值