diff --git a/fxbarcode/common/reedsolomon/BC_ReedSolomon.cpp b/fxbarcode/common/reedsolomon/BC_ReedSolomon.cpp
index 71d5dd9..f19886e 100644
--- a/fxbarcode/common/reedsolomon/BC_ReedSolomon.cpp
+++ b/fxbarcode/common/reedsolomon/BC_ReedSolomon.cpp
@@ -31,8 +31,8 @@
 
 CBC_ReedSolomonEncoder::CBC_ReedSolomonEncoder(CBC_ReedSolomonGF256* field)
     : m_field(field) {
-  m_cachedGenerators.push_back(
-      pdfium::MakeUnique<CBC_ReedSolomonGF256Poly>(m_field.Get(), 1));
+  m_cachedGenerators.push_back(pdfium::MakeUnique<CBC_ReedSolomonGF256Poly>(
+      m_field.Get(), std::vector<int32_t>{1}));
 }
 
 CBC_ReedSolomonEncoder::~CBC_ReedSolomonEncoder() {}
@@ -42,10 +42,8 @@
   if (degree >= m_cachedGenerators.size()) {
     CBC_ReedSolomonGF256Poly* lastGenerator = m_cachedGenerators.back().get();
     for (size_t d = m_cachedGenerators.size(); d <= degree; ++d) {
-      std::vector<int32_t> temp = {1, m_field->Exp(d - 1)};
-      CBC_ReedSolomonGF256Poly temp_poly;
-      temp_poly.Init(m_field.Get(), temp);
-
+      CBC_ReedSolomonGF256Poly temp_poly(m_field.Get(),
+                                         {1, m_field->Exp(d - 1)});
       auto nextGenerator = lastGenerator->Multiply(&temp_poly);
       if (!nextGenerator)
         return nullptr;
@@ -74,9 +72,7 @@
   for (size_t x = 0; x < dataBytes; x++)
     infoCoefficients[x] = (*toEncode)[x];
 
-  CBC_ReedSolomonGF256Poly info;
-  info.Init(m_field.Get(), infoCoefficients);
-
+  CBC_ReedSolomonGF256Poly info(m_field.Get(), infoCoefficients);
   auto infoTemp = info.MultiplyByMonomial(ecBytes, 1);
   if (!infoTemp)
     return false;
diff --git a/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.cpp b/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.cpp
index ec7878c..b0dd0a2 100644
--- a/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.cpp
+++ b/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.cpp
@@ -60,8 +60,10 @@
 }
 
 void CBC_ReedSolomonGF256::Init() {
-  m_zero = pdfium::MakeUnique<CBC_ReedSolomonGF256Poly>(this, 0);
-  m_one = pdfium::MakeUnique<CBC_ReedSolomonGF256Poly>(this, 1);
+  m_zero = pdfium::MakeUnique<CBC_ReedSolomonGF256Poly>(
+      this, std::vector<int32_t>{0});
+  m_one = pdfium::MakeUnique<CBC_ReedSolomonGF256Poly>(this,
+                                                       std::vector<int32_t>{1});
 }
 
 CBC_ReedSolomonGF256::~CBC_ReedSolomonGF256() {}
@@ -85,9 +87,7 @@
 
   std::vector<int32_t> coefficients(degree + 1);
   coefficients[0] = coefficient;
-  auto temp = pdfium::MakeUnique<CBC_ReedSolomonGF256Poly>();
-  temp->Init(this, coefficients);
-  return temp;
+  return pdfium::MakeUnique<CBC_ReedSolomonGF256Poly>(this, coefficients);
 }
 
 // static
diff --git a/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256Poly.cpp b/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256Poly.cpp
index 59e239e..15f4259 100644
--- a/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256Poly.cpp
+++ b/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256Poly.cpp
@@ -30,26 +30,12 @@
 #include "third_party/base/ptr_util.h"
 #include "third_party/base/stl_util.h"
 
-CBC_ReedSolomonGF256Poly::CBC_ReedSolomonGF256Poly(CBC_ReedSolomonGF256* field,
-                                                   int32_t coefficients) {
-  if (!field)
-    return;
-
-  m_field = field;
-  m_coefficients.push_back(coefficients);
-}
-
-CBC_ReedSolomonGF256Poly::CBC_ReedSolomonGF256Poly() {
-  m_field = nullptr;
-}
-
-CBC_ReedSolomonGF256Poly::~CBC_ReedSolomonGF256Poly() = default;
-
-void CBC_ReedSolomonGF256Poly::Init(CBC_ReedSolomonGF256* field,
-                                    const std::vector<int32_t>& coefficients) {
+CBC_ReedSolomonGF256Poly::CBC_ReedSolomonGF256Poly(
+    CBC_ReedSolomonGF256* field,
+    const std::vector<int32_t>& coefficients)
+    : m_field(field) {
+  ASSERT(m_field);
   ASSERT(!coefficients.empty());
-
-  m_field = field;
   if (coefficients.size() == 1 || coefficients.front() != 0) {
     m_coefficients = coefficients;
     return;
@@ -69,6 +55,8 @@
   }
 }
 
+CBC_ReedSolomonGF256Poly::~CBC_ReedSolomonGF256Poly() = default;
+
 const std::vector<int32_t>& CBC_ReedSolomonGF256Poly::GetCoefficients() const {
   return m_coefficients;
 }
@@ -87,9 +75,8 @@
 
 std::unique_ptr<CBC_ReedSolomonGF256Poly> CBC_ReedSolomonGF256Poly::Clone()
     const {
-  auto temp = pdfium::MakeUnique<CBC_ReedSolomonGF256Poly>();
-  temp->Init(m_field.Get(), m_coefficients);
-  return temp;
+  return pdfium::MakeUnique<CBC_ReedSolomonGF256Poly>(m_field.Get(),
+                                                      m_coefficients);
 }
 
 std::unique_ptr<CBC_ReedSolomonGF256Poly>
@@ -106,16 +93,14 @@
 
   std::vector<int32_t> sumDiff(largerCoefficients.size());
   size_t lengthDiff = largerCoefficients.size() - smallerCoefficients.size();
-  for (size_t i = 0; i < lengthDiff; i++)
+  for (size_t i = 0; i < lengthDiff; ++i)
     sumDiff[i] = largerCoefficients[i];
 
-  for (size_t j = lengthDiff; j < largerCoefficients.size(); j++) {
-    sumDiff[j] = CBC_ReedSolomonGF256::AddOrSubtract(
-        smallerCoefficients[j - lengthDiff], largerCoefficients[j]);
+  for (size_t i = lengthDiff; i < largerCoefficients.size(); ++i) {
+    sumDiff[i] = CBC_ReedSolomonGF256::AddOrSubtract(
+        smallerCoefficients[i - lengthDiff], largerCoefficients[i]);
   }
-  auto temp = pdfium::MakeUnique<CBC_ReedSolomonGF256Poly>();
-  temp->Init(m_field.Get(), sumDiff);
-  return temp;
+  return pdfium::MakeUnique<CBC_ReedSolomonGF256Poly>(m_field.Get(), sumDiff);
 }
 
 std::unique_ptr<CBC_ReedSolomonGF256Poly> CBC_ReedSolomonGF256Poly::Multiply(
@@ -135,9 +120,7 @@
           product[i + j], m_field->Multiply(aCoeff, bCoefficients[j]));
     }
   }
-  auto temp = pdfium::MakeUnique<CBC_ReedSolomonGF256Poly>();
-  temp->Init(m_field.Get(), product);
-  return temp;
+  return pdfium::MakeUnique<CBC_ReedSolomonGF256Poly>(m_field.Get(), product);
 }
 
 std::unique_ptr<CBC_ReedSolomonGF256Poly> CBC_ReedSolomonGF256Poly::Multiply(
@@ -152,9 +135,7 @@
   for (size_t i = 0; i < size; i++)
     product[i] = m_field->Multiply(m_coefficients[i], scalar);
 
-  auto temp = pdfium::MakeUnique<CBC_ReedSolomonGF256Poly>();
-  temp->Init(m_field.Get(), product);
-  return temp;
+  return pdfium::MakeUnique<CBC_ReedSolomonGF256Poly>(m_field.Get(), product);
 }
 
 std::unique_ptr<CBC_ReedSolomonGF256Poly>
@@ -170,9 +151,7 @@
   for (size_t i = 0; i < size; i++)
     product[i] = m_field->Multiply(m_coefficients[i], coefficient);
 
-  auto temp = pdfium::MakeUnique<CBC_ReedSolomonGF256Poly>();
-  temp->Init(m_field.Get(), product);
-  return temp;
+  return pdfium::MakeUnique<CBC_ReedSolomonGF256Poly>(m_field.Get(), product);
 }
 
 std::unique_ptr<CBC_ReedSolomonGF256Poly> CBC_ReedSolomonGF256Poly::Divide(
diff --git a/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256Poly.h b/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256Poly.h
index c3a3370c..0f046ce 100644
--- a/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256Poly.h
+++ b/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256Poly.h
@@ -16,13 +16,10 @@
 
 class CBC_ReedSolomonGF256Poly final {
  public:
-  CBC_ReedSolomonGF256Poly(CBC_ReedSolomonGF256* field, int32_t coefficients);
-  CBC_ReedSolomonGF256Poly();
+  CBC_ReedSolomonGF256Poly(CBC_ReedSolomonGF256* field,
+                           const std::vector<int32_t>& coefficients);
   ~CBC_ReedSolomonGF256Poly();
 
-  void Init(CBC_ReedSolomonGF256* field,
-            const std::vector<int32_t>& coefficients);
-
   int32_t GetCoefficients(int32_t degree) const;
   const std::vector<int32_t>& GetCoefficients() const;
   int32_t GetDegree() const;
@@ -40,7 +37,7 @@
   std::unique_ptr<CBC_ReedSolomonGF256Poly> Clone() const;
 
  private:
-  UnownedPtr<CBC_ReedSolomonGF256> m_field;
+  UnownedPtr<CBC_ReedSolomonGF256> const m_field;
   std::vector<int32_t> m_coefficients;
 };
 
