实用程序类的内部对象?

时间:2019-12-18 19:32:08

标签: intellij-idea kotlin companion-object

我使用IntelliJ的Kotlin到Java转换工具将Java Utility Class(所有类方法都是静态的,无法实例化)转换为Kotlin。

IntelliJ创建了以下形式的内部对象:

import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import odeint

def satellitefunc(f, time, mu):
    r = np.sqrt((f[0] + mu)**2 + f[2]**2)
    s = np.sqrt((f[0] + mu - 1)**2 + f[2]**2)
    f0 = f[1]
    f1 = f[0] + 2*f[3] - (1-mu)*(f[0]+mu)/(r**3) - mu*(f[0] - 1 + mu)/(s**3)
    f2 = f[3]
    f3 = f[2] - 2*f[1] - (1-mu)*(f[2])/(r**3) - mu*f[2]/(s**3)
    return np.array([f0,f1,f2,f3])

def satellite(init, time, mu):
    fsolve = odeint(satellitefunc, init, time, args=(mu,))
    return fsolve

time = np.linspace(0, 18, 200)
init = np.array([0.994,0,0,-2.0015851])
mu = 0.012277471

answer = satellite(init,time,mu)


fig, ax = plt.subplots(1, 3)


ax[0].set_title('Plots of x and y against time')
ax[0].set_xlabel('time')
ax[0].set_ylabel('displacement')
ax[0].plot(time,answer[:,0],label='x(t)')
ax[0].plot(time,answer[:,2],label='y(t)')
ax[0].legend()

ax[1].set_title('Trajectory of object')
ax[1].set_xlabel('x(t)')
ax[1].set_ylabel('y(t)')
ax[1].plot(answer[:,0],answer[:,2])

ax[2].set_title('Parametric plot of dy(t)/dt against dx(t)/dt')
ax[2].set_xlabel('dx(t)/dt')
ax[2].set_ylabel('dy(t)/dt')
ax[2].plot(answer[:,1],answer[:,3])

fig.subplots_adjust(wspace = 0.5)

这与通过伴侣对象创建类有何不同?

1 个答案:

答案 0 :(得分:1)

我同意JB Nizet所说的那样,它避免了创建不必要的类,还有另一个好处,就是使用internal,这意味着在要使用您的项目的情况下,您不会公开该实用程序类。作为其他项目的依赖。当然,在某些情况下,您希望拥有一个包含一些有用的实用程序方法的库,在这种情况下,您可以删除internal修饰符,但在许多其他情况下,最好只提供美观的API,同时隐藏实用程序您正在使用的方法。